문제
루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다.
큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.
이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.
루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.
위의 그림은 루빅스 큐브를 푼 그림이다. 왼쪽 면은 시계방향으로 조금 돌려져 있는 상태이다.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.
- 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
- 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.
출력
각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.
풀이 과정
큐브 6면의 색을 배열로 구조화하여 저장한 후 단순 구현으로 풀이했다. 함수를 이용해 큐브를 돌린 방법이 들어올 때 마다 큐브 면의 색깔 정보를 바꿀 수 있도록 명령어화 시켰다.
import sys
input = sys.stdin.readline
def rotate(order):
# dir 0 : Rotate clockwise / 1 : Rotate counterclockwise
if order[0] == 'U': rotate_u(0 if order[1] == '+' else 1)
elif order[0] == 'L': rotate_l(0 if order[1] == '+' else 1)
elif order[0] == 'F': rotate_f(0 if order[1] == '+' else 1)
elif order[0] == 'R': rotate_r(0 if order[1] == '+' else 1)
elif order[0] == 'B': rotate_b(0 if order[1] == '+' else 1)
elif order[0] == 'D': rotate_d(0 if order[1] == '+' else 1)
def rotate_u(dir):
global cube
if dir == 0:
up_new = [[cube[0][2][0], cube[0][1][0], cube[0][0][0]], [cube[0][2][1], cube[0][1][1], cube[0][0][1]], [cube[0][2][2], cube[0][1][2], cube[0][0][2]]]
cube[0] = up_new
left_r1_new = [cube[2][0][0], cube[2][0][1], cube[2][0][2]]
front_r1_new = [cube[3][0][0], cube[3][0][1], cube[3][0][2]]
right_r1_new = [cube[4][0][0], cube[4][0][1], cube[4][0][2]]
back_r1_new = [cube[1][0][0], cube[1][0][1], cube[1][0][2]]
cube[1][0] = left_r1_new
cube[2][0] = front_r1_new
cube[3][0] = right_r1_new
cube[4][0] = back_r1_new
else:
up_new = [[cube[0][0][2], cube[0][1][2], cube[0][2][2]], [cube[0][0][1], cube[0][1][1], cube[0][2][1]], [cube[0][0][0], cube[0][1][0], cube[0][2][0]]]
cube[0] = up_new
left_r1_new = [cube[4][0][0], cube[4][0][1], cube[4][0][2]]
front_r1_new = [cube[1][0][0], cube[1][0][1], cube[1][0][2]]
right_r1_new = [cube[2][0][0], cube[2][0][1], cube[2][0][2]]
back_r1_new = [cube[3][0][0], cube[3][0][1], cube[3][0][2]]
cube[1][0] = left_r1_new
cube[2][0] = front_r1_new
cube[3][0] = right_r1_new
cube[4][0] = back_r1_new
def rotate_l(dir):
global cube
if dir == 0:
left_new = [[cube[1][2][0], cube[1][1][0], cube[1][0][0]], [cube[1][2][1], cube[1][1][1], cube[1][0][1]], [cube[1][2][2], cube[1][1][2], cube[1][0][2]]]
cube[1] = left_new
up_c1_new = [cube[4][2][2], cube[4][1][2], cube[4][0][2]]
front_c1_new = [cube[0][0][0], cube[0][1][0], cube[0][2][0]]
down_c1_new = [cube[2][0][0], cube[2][1][0], cube[2][2][0]]
back_c3_new = [cube[5][2][0], cube[5][1][0], cube[5][0][0]]
cube[0][0][0] = up_c1_new[0]; cube[0][1][0] = up_c1_new[1]; cube[0][2][0] = up_c1_new[2]
cube[2][0][0] = front_c1_new[0]; cube[2][1][0] = front_c1_new[1]; cube[2][2][0] = front_c1_new[2]
cube[5][0][0] = down_c1_new[0]; cube[5][1][0] = down_c1_new[1]; cube[5][2][0] = down_c1_new[2]
cube[4][0][2] = back_c3_new[0]; cube[4][1][2] = back_c3_new[1]; cube[4][2][2] = back_c3_new[2]
else:
left_new = [[cube[1][0][2], cube[1][1][2], cube[1][2][2]], [cube[1][0][1], cube[1][1][1], cube[1][2][1]], [cube[1][0][0], cube[1][1][0], cube[1][2][0]]]
cube[1] = left_new
up_c1_new = [cube[2][0][0], cube[2][1][0], cube[2][2][0]]
front_c1_new = [cube[5][0][0], cube[5][1][0], cube[5][2][0]]
down_c1_new = [cube[4][2][2], cube[4][1][2], cube[4][0][2]]
back_c3_new = [cube[0][2][0], cube[0][1][0], cube[0][0][0]]
cube[0][0][0] = up_c1_new[0]; cube[0][1][0] = up_c1_new[1]; cube[0][2][0] = up_c1_new[2]
cube[2][0][0] = front_c1_new[0]; cube[2][1][0] = front_c1_new[1]; cube[2][2][0] = front_c1_new[2]
cube[5][0][0] = down_c1_new[0]; cube[5][1][0] = down_c1_new[1]; cube[5][2][0] = down_c1_new[2]
cube[4][0][2] = back_c3_new[0]; cube[4][1][2] = back_c3_new[1]; cube[4][2][2] = back_c3_new[2]
def rotate_f(dir):
global cube
if dir == 0:
front_new = [[cube[2][2][0], cube[2][1][0], cube[2][0][0]], [cube[2][2][1], cube[2][1][1], cube[2][0][1]], [cube[2][2][2], cube[2][1][2], cube[2][0][2]]]
cube[2] = front_new
up_r3_new = [cube[1][2][2], cube[1][1][2], cube[1][0][2]]
left_c3_new = cube[5][0]
right_c1_new = cube[0][2]
down_r1_new = [cube[3][2][0], cube[3][1][0], cube[3][0][0]]
cube[0][2] = up_r3_new
cube[1][0][2] = left_c3_new[0]; cube[1][1][2] = left_c3_new[1]; cube[1][2][2] = left_c3_new[2]
cube[3][0][0] = right_c1_new[0]; cube[3][1][0] = right_c1_new[1]; cube[3][2][0] = right_c1_new[2]
cube[5][0] = down_r1_new
else:
front_new = [[cube[2][0][2], cube[2][1][2], cube[2][2][2]], [cube[2][0][1], cube[2][1][1], cube[2][2][1]], [cube[2][0][0], cube[2][1][0], cube[2][2][0]]]
cube[2] = front_new
up_r3_new = [cube[3][0][0], cube[3][1][0], cube[3][2][0]]
left_c3_new = [cube[0][2][2], cube[0][2][1], cube[0][2][0]]
right_c1_new = [cube[5][0][2], cube[5][0][1], cube[5][0][0]]
down_r1_new = [cube[1][0][2], cube[1][1][2], cube[1][2][2]]
cube[0][2] = up_r3_new
cube[1][0][2] = left_c3_new[0]; cube[1][1][2] = left_c3_new[1]; cube[1][2][2] = left_c3_new[2]
cube[3][0][0] = right_c1_new[0]; cube[3][1][0] = right_c1_new[1]; cube[3][2][0] = right_c1_new[2]
cube[5][0] = down_r1_new
def rotate_r(dir):
global cube
if dir == 0:
right_new = [[cube[3][2][0], cube[3][1][0], cube[3][0][0]], [cube[3][2][1], cube[3][1][1], cube[3][0][1]], [cube[3][2][2], cube[3][1][2], cube[3][0][2]]]
cube[3] = right_new
up_c3_new = [cube[2][0][2], cube[2][1][2], cube[2][2][2]]
front_c3_new = [cube[5][0][2], cube[5][1][2], cube[5][2][2]]
down_c3_new = [cube[4][2][0], cube[4][1][0], cube[4][0][0]]
back_c1_new = [cube[0][2][2], cube[0][1][2], cube[0][0][2]]
cube[0][0][2] = up_c3_new[0]; cube[0][1][2] = up_c3_new[1]; cube[0][2][2] = up_c3_new[2]
cube[2][0][2] = front_c3_new[0]; cube[2][1][2] = front_c3_new[1]; cube[2][2][2] = front_c3_new[2]
cube[5][0][2] = down_c3_new[0]; cube[5][1][2] = down_c3_new[1]; cube[5][2][2] = down_c3_new[2]
cube[4][0][0] = back_c1_new[0]; cube[4][1][0] = back_c1_new[1]; cube[4][2][0] = back_c1_new[2]
else:
right_new = [[cube[3][0][2], cube[3][1][2], cube[3][2][2]], [cube[3][0][1], cube[3][1][1], cube[3][2][1]], [cube[3][0][0], cube[3][1][0], cube[3][2][0]]]
cube[3] = right_new
up_c3_new = [cube[4][2][0], cube[4][1][0], cube[4][0][0]]
front_c3_new = [cube[0][0][2], cube[0][1][2], cube[0][2][2]]
down_c3_new = [cube[2][0][2], cube[2][1][2], cube[2][2][2]]
back_c1_new = [cube[5][2][2], cube[5][1][2], cube[5][0][2]]
cube[0][0][2] = up_c3_new[0]; cube[0][1][2] = up_c3_new[1]; cube[0][2][2] = up_c3_new[2]
cube[2][0][2] = front_c3_new[0]; cube[2][1][2] = front_c3_new[1]; cube[2][2][2] = front_c3_new[2]
cube[5][0][2] = down_c3_new[0]; cube[5][1][2] = down_c3_new[1]; cube[5][2][2] = down_c3_new[2]
cube[4][0][0] = back_c1_new[0]; cube[4][1][0] = back_c1_new[1]; cube[4][2][0] = back_c1_new[2]
def rotate_b(dir):
global cube
if dir == 0:
back_new = [[cube[4][2][0], cube[4][1][0], cube[4][0][0]], [cube[4][2][1], cube[4][1][1], cube[4][0][1]], [cube[4][2][2], cube[4][1][2], cube[4][0][2]]]
cube[4] = back_new
up_r1_new = [cube[3][0][2], cube[3][1][2], cube[3][2][2]]
left_c1_new = [cube[0][0][2], cube[0][0][1], cube[0][0][0]]
right_c3_new = [cube[5][2][2], cube[5][2][1], cube[5][2][0]]
down_r3_new = [cube[1][0][0], cube[1][1][0], cube[1][2][0]]
cube[0][0] = up_r1_new
cube[1][0][0] = left_c1_new[0]; cube[1][1][0] = left_c1_new[1]; cube[1][2][0] = left_c1_new[2]
cube[3][0][2] = right_c3_new[0]; cube[3][1][2] = right_c3_new[1]; cube[3][2][2] = right_c3_new[2]
cube[5][2] = down_r3_new
else:
back_new = [[cube[4][0][2], cube[4][1][2], cube[4][2][2]], [cube[4][0][1], cube[4][1][1], cube[4][2][1]], [cube[4][0][0], cube[4][1][0], cube[4][2][0]]]
cube[4] = back_new
up_r1_new = [cube[1][2][0], cube[1][1][0], cube[1][0][0]]
left_c1_new = cube[5][2]
right_c3_new = cube[0][0]
down_r3_new = [cube[3][2][2], cube[3][1][2], cube[3][0][2]]
cube[0][0] = up_r1_new
cube[1][0][0] = left_c1_new[0]; cube[1][1][0] = left_c1_new[1]; cube[1][2][0] = left_c1_new[2]
cube[3][0][2] = right_c3_new[0]; cube[3][1][2] = right_c3_new[1]; cube[3][2][2] = right_c3_new[2]
cube[5][2] = down_r3_new
def rotate_d(dir):
global cube
if dir == 0:
down_new = [[cube[5][2][0], cube[5][1][0], cube[5][0][0]], [cube[5][2][1], cube[5][1][1], cube[5][0][1]], [cube[5][2][2], cube[5][1][2], cube[5][0][2]]]
cube[5] = down_new
left_r3_new = cube[4][2]
front_r3_new = cube[1][2]
right_r3_new = cube[2][2]
back_r3_new = cube[3][2]
cube[1][2] = left_r3_new
cube[2][2] = front_r3_new
cube[3][2] = right_r3_new
cube[4][2] = back_r3_new
else:
down_new = [[cube[5][0][2], cube[5][1][2], cube[5][2][2]], [cube[5][0][1], cube[5][1][1], cube[5][2][1]], [cube[5][0][0], cube[5][1][0], cube[5][2][0]]]
cube[5] = down_new
left_r3_new = cube[2][2]
front_r3_new = cube[3][2]
right_r3_new = cube[4][2]
back_r3_new = cube[1][2]
cube[1][2] = left_r3_new
cube[2][2] = front_r3_new
cube[3][2] = right_r3_new
cube[4][2] = back_r3_new
test = int(input())
for t in range(test):
# 0 : Up, 1 : Left, 2 : Front, 3 : Right, 4 : Back, 5 : Down
cube = [
[['w', 'w', 'w'], ['w', 'w', 'w'], ['w', 'w', 'w']],
[['g', 'g', 'g'], ['g', 'g', 'g'], ['g', 'g', 'g']],
[['r', 'r', 'r'], ['r', 'r', 'r'], ['r', 'r', 'r']],
[['b', 'b', 'b'], ['b', 'b', 'b'], ['b', 'b', 'b']],
[['o', 'o', 'o'], ['o', 'o', 'o'], ['o', 'o', 'o']],
[['y', 'y', 'y'], ['y', 'y', 'y'], ['y', 'y', 'y']]
]
n = int(input())
order = list(input().split())
for o in order: rotate(o)
for a in cube[0]: print(''.join(a))
오타가 종종 나서 수정하기가 어려웠던 풀이였다.
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 2955 : 스도쿠 풀기 ( GOLD 2 ) / Python (0) | 2023.03.11 |
---|---|
[ BOJ ] 16932 : 모양 만들기 ( GOLD 3 ) / Python (0) | 2023.03.11 |
[ BOJ ] 12837 : 가계부 (Hard) ( GOLD 1 ) / C (0) | 2023.03.10 |
[ BOJ ] 2042 : 구간 합 구하기 ( GOLD 1 ) / Python (0) | 2023.03.09 |
[ BOJ ] 10800 : 컬러볼 ( GOLD 3 ) / Python (0) | 2023.03.03 |