큐빙
문제
루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다.
큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.
이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.
루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.

위의 그림은 루빅스 큐브를 푼 그림이다. 왼쪽 면은 시계방향으로 조금 돌려져 있는 상태이다.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.
- 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
- 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.
출력
각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.
예제 입력 1 복사
4
1
L-
2
F+ B+
4
U- D- L+ R+
10
L- U- L+ U- L- U- U- L+ U+ U+
예제 출력 1 복사
rww
rww
rww
bbb
www
ggg
gwg
owr
bwb
gwo
www
rww
풀이
난이도는 플레티넘5 로 완전 탐색, 2차원 배열 변환 등 고려해줄 요소가 많다.
많은 사람들은 3차원 배열을 통해 전부 배열을 생성해주었지만 본인은 직접 Rotation 구현 경로를 구축하고 구현하여 직접 함수로 실행시켜주어 재사용성을 높였다. 고민이 많았던 문제라 3시간 정도 직접 필기하며 해결했다.
< 조건 >
- 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다
- 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력
- 두 번째, 세 번째 줄은 순서대로 출력하면 된다
- 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.
각각의 방향 을 rotate하여 구현하였고 함수로 작성해주었다. rotate_front는 앞부분을 돌렸을 경우, rotate_back은 뒷부분을 돌렸을 경우 등 6면의 경우를 각각 생각해주었다.
코드
# https://www.acmicpc.net/problem/5373
def rotate_90(cube):
cube = list(zip(*cube[::-1]))
for i in range(len(cube)):
cube[i] = list(cube[i])
return cube
def result_leftright(cube):
result = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
result[i][j] = cube[i+9][j+3]
arr_zero = result[0]
arr_one = result[1]
arr_two = result[2]
new_result = [[0 for _ in range(3)] for _ in range(3)]
new_result[0] = arr_two
new_result[1] = arr_one
new_result[2] = arr_zero
arr_zero = []
arr_one = []
arr_two = []
for i in range(3):
new_result[i][0], new_result[i][2] = new_result[i][2], new_result[i][0]
for i in range(3):
for j in range(3):
cube[i+3][j+9] = new_result[i][j]
return cube
def result_updown(cube):
result = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
result[i][j] = cube[i+3][j+9]
for i in range(3):
result[i][0], result[i][2] = result[i][2], result[i][0]
arr_zero = result[0]
arr_one = result[1]
arr_two = result[2]
new_result = [[0 for _ in range(3)] for _ in range(3)]
new_result[0] = arr_two
new_result[1] = arr_one
new_result[2] = arr_zero
for i in range(3):
for j in range(3):
cube[i+9][j+3] = new_result[i][j]
return cube
def rotate_up(direction, cube):
arr = cube[3]
up_result = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
up_result[i][j] = cube[i][j+3]
if direction == '+':
up_result = rotate_90(up_result)
else:
up_result = rotate_90(up_result)
up_result = rotate_90(up_result)
up_result = rotate_90(up_result)
for i in range(3):
for j in range(3):
cube[i][j+3] = up_result[i][j]
for i in range(3):
new_arr = [0 for _ in range(len(arr))]
if direction == '-':
for i in range(len(arr)-1):
new_arr[i+1] = arr[i]
new_arr[0] = arr[len(arr)-1]
else:
for i in range(len(arr)-1):
new_arr[i] = arr[i+1]
new_arr[len(arr)-1] = arr[0]
arr = new_arr
cube[3] = arr
cube = result_updown(cube)
return cube
def rotate_down(direction, cube):
arr = cube[5]
down_result = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
down_result[i][j] = cube[i+6][j+3]
if direction == '+':
down_result = rotate_90(down_result)
else:
down_result = rotate_90(down_result)
down_result = rotate_90(down_result)
down_result = rotate_90(down_result)
for i in range(3):
for j in range(3):
cube[i+6][j+3] = down_result[i][j]
for i in range(3):
new_arr = [0 for _ in range(len(arr))]
if direction == '+':
for i in range(len(arr)-1):
new_arr[i+1] = arr[i]
new_arr[0] = arr[len(arr)-1]
else:
for i in range(len(arr)-1):
new_arr[i] = arr[i+1]
new_arr[len(arr)-1] = arr[0]
arr = new_arr
cube[5] = arr
cube = result_updown(cube)
return cube
def rotate_left(direction, cube):
left_result = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
left_result[i][j] = cube[i+3][j]
if direction == '+':
left_result = rotate_90(left_result)
else:
left_result = rotate_90(left_result)
left_result = rotate_90(left_result)
left_result = rotate_90(left_result)
for i in range(3):
for j in range(3):
cube[i+3][j] = left_result[i][j]
cube = rotate_90(cube)
arr = cube[3]
for i in range(3):
new_arr = [0 for _ in range(len(arr))]
if direction == '-':
for i in range(len(arr)-1):
new_arr[i+1] = arr[i]
new_arr[0] = arr[len(arr)-1]
else:
for i in range(len(arr)-1):
new_arr[i] = arr[i+1]
new_arr[len(arr)-1] = arr[0]
arr = new_arr
cube[3] = arr
cube = rotate_90(cube)
cube = rotate_90(cube)
cube = rotate_90(cube)
cube = result_leftright(cube)
return cube
def rotate_right(direction, cube):
right_result = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
right_result[i][j] = cube[i+3][j+6]
if direction == '+':
right_result = rotate_90(right_result)
else:
right_result = rotate_90(right_result)
right_result = rotate_90(right_result)
right_result = rotate_90(right_result)
for i in range(3):
for j in range(3):
cube[i+3][j+6] = right_result[i][j]
cube = rotate_90(cube)
arr = cube[5]
for i in range(3):
new_arr = [0 for _ in range(len(arr))]
if direction == '+':
for i in range(len(arr)-1):
new_arr[i+1] = arr[i]
new_arr[0] = arr[len(arr)-1]
else:
for i in range(len(arr)-1):
new_arr[i] = arr[i+1]
new_arr[len(arr)-1] = arr[0]
arr = new_arr
cube[5] = arr
cube = rotate_90(cube)
cube = rotate_90(cube)
cube = rotate_90(cube)
cube = result_leftright(cube)
return cube
def rotate_front(direction, cube):
result = [[0 for _ in range(5)] for _ in range(5)]
for i in range(5):
for j in range(5):
result[i][j] = cube[i+2][j+2]
if direction == '+':
result = rotate_90(result)
else:
result = rotate_90(result)
result = rotate_90(result)
result = rotate_90(result)
for i in range(5):
for j in range(5):
cube[i+2][j+2] = result[i][j]
return cube
def rotate_back(direction, cube): #수정해보기
result = [[0 for _ in range(9)] for _ in range(9)]
real_back = [[0 for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
real_back[i][j] = cube[i+9][j+3]
real_back[0], real_back[2] = real_back[2], real_back[0]
if direction == '+':
real_back = rotate_90(real_back)
real_back = rotate_90(real_back)
real_back = rotate_90(real_back)
else:
real_back = rotate_90(real_back)
real_back[0], real_back[2] = real_back[2], real_back[0]
for i in range(9):
for j in range(9):
result[i][j] = cube[i][j]
if direction == '-':
result = rotate_90(result)
else:
result = rotate_90(result)
result = rotate_90(result)
result = rotate_90(result)
for i in range(9):
for j in range(9):
if i == 0 or j == 0 or i == 8 or j == 8:
cube[i][j] = result[i][j]
for i in range(3):
for j in range(3):
cube[i+9][j+3] = real_back[i][j]
cube = result_leftright(cube)
return cube
def firstState():
cube = [['|' for _ in range(12)] for _ in range(12)]
for i in range(3):
for j in range(3):
cube[i][j+3] = 'w'
for i in range(3):
for j in range(3):
cube[i+3][j] = 'g'
for i in range(3):
for j in range(3):
cube[i+3][j+3] = 'r'
for i in range(3):
for j in range(3):
cube[i+3][j+6] = 'b'
for i in range(3):
for j in range(3):
cube[i+3][j+9] = 'o'
for i in range(3):
for j in range(3):
cube[i+6][j+3] = 'y'
for i in range(3):
for j in range(3):
cube[i+9][j+3] = 'o'
return cube
def turn(direct, cube):
if direct[0] == 'U':
cube = rotate_up(direct[1], cube) # +, cube
elif direct[0] == 'D':
cube = rotate_down(direct[1], cube) # +, cube
elif direct[0] == 'F':
cube = rotate_front(direct[1], cube) # +, cube
elif direct[0] == 'B':
cube = rotate_back(direct[1], cube) # +, cube
elif direct[0] == 'L':
cube = rotate_left(direct[1], cube) # +, cube
elif direct[0] == 'R':
cube = rotate_right(direct[1], cube) # +, cube
return cube
N = int(input())
ans = []
# U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면
for i in range(N):
cnt = int(input())
arr = list(map(str, input().split()))
cube = firstState()
for j in arr:
cube = turn(j, cube)
for i in range(3):
str_s = cube[i][3] + cube[i][4] + cube[i][5]
ans.append(str_s)
# U+ B- R- F- D+ L- B+ U-
for i in ans:
print(i)
'알고리즘 > 완전탐색' 카테고리의 다른 글
백준 17825번) 주사위 윷놀이 - 파이썬 (0) | 2022.10.03 |
---|