https://www.acmicpc.net/problem/5373
공부 날짜 : 2022.09.14
정답 참조 여부 : O
루빅스 큐브를 입력순서대로 회전시켰을때 윗면의 모양을 출력하는 문제이다.
알고리즘이 아닌 내용 그대로 구현만하면 되는 문제로
당신이 작성한 코드가 틀려서 구글에 검색해봤다면 당신이 생각한 방법이 맞으니
정답을 보는것보다 처음부터 짜는게 나을수도 있다. 보고 이해하는 시간보다 생각한대로 처음부터 다시구현하는게 빠를 수 있다.
이런 종류의 문제는 내용이 어렵다기 보다 많이 헷갈리고 실수가 발생해서 틀리는 경우가 많고 만일 틀렸을경우 어디서 틀렸는지 찾는것 조차 굉장히 어렵기 때문에 개인적으로 정말 싫어하는 문제이다.
import sys
from copy import deepcopy
input = sys.stdin.readline
#테스트 케이스 수만큼 반복하는 함수
def main():
U = [['w']*3 for _ in range(3)]
D = [['y']*3 for _ in range(3)]
F = [['r']*3 for _ in range(3)]
B = [['o']*3 for _ in range(3)]
L = [['g']*3 for _ in range(3)]
R = [['b']*3 for _ in range(3)]
#돌릴 횟수
n = int(input())
#돌려야 하는 방법
pass_ = list(input().split())
for i in pass_:
#F,B,R,L의 1행 돌리기
if i[0] == 'U':
U = turn(deepcopy(U), i[1])
f1,f2,f3 = F[0][0], F[0][1], F[0][2]
l1,l2,l3 = L[0][0], L[0][1], L[0][2]
b1,b2,b3 = B[0][0], B[0][1], B[0][2]
r1,r2,r3 = R[0][0], R[0][1], R[0][2]
if i[1] == '+':
F[0][0], F[0][1], F[0][2] = r1,r2,r3
L[0][0], L[0][1], L[0][2] = f1,f2,f3
B[0][0], B[0][1], B[0][2] = l1,l2,l3
R[0][0], R[0][1], R[0][2] = b1,b2,b3
elif i[1] == '-':
F[0][0], F[0][1], F[0][2] = l1,l2,l3
L[0][0], L[0][1], L[0][2] = b1,b2,b3
B[0][0], B[0][1], B[0][2] = r1,r2,r3
R[0][0], R[0][1], R[0][2] = f1,f2,f3
#F,B,R,L의 3행 돌리기
elif i[0] == 'D':
D = turn(deepcopy(D), i[1])
f1,f2,f3 = F[2][0], F[2][1], F[2][2]
b1,b2,b3 = B[2][0], B[2][1], B[2][2]
r1,r2,r3 = R[2][0], R[2][1], R[2][2]
l1,l2,l3 = L[2][0], L[2][1], L[2][2]
if i[1] == '+':
F[2][0], F[2][1], F[2][2] = l1,l2,l3
B[2][0], B[2][1], B[2][2] = r1,r2,r3
R[2][0], R[2][1], R[2][2] = f1,f2,f3
L[2][0], L[2][1], L[2][2] = b1,b2,b3
elif i[1] == '-':
F[2][0], F[2][1], F[2][2] = r1,r2,r3
B[2][0], B[2][1], B[2][2] = l1,l2,l3
R[2][0], R[2][1], R[2][2] = b1,b2,b3
L[2][0], L[2][1], L[2][2] = f1,f2,f3
#U의 3행, D의 3행, R의 1열 L의 3열
elif i[0] == 'F':
F = turn(deepcopy(F), i[1])
u1,u2,u3 = U[2][0], U[2][1], U[2][2]
d1,d2,d3 = D[2][0], D[2][1], D[2][2]
r1,r2,r3 = R[0][0], R[1][0], R[2][0]
l1,l2,l3 = L[2][2], L[1][2], L[0][2]
if i[1] == '+':
U[2][0], U[2][1], U[2][2] = l1,l2,l3
D[2][0], D[2][1], D[2][2] = r1,r2,r3
R[0][0], R[1][0], R[2][0] = u1,u2,u3
L[2][2], L[1][2], L[0][2] = d1,d2,d3
elif i[1] == '-':
U[2][0], U[2][1], U[2][2] = r1,r2,r3
D[2][0], D[2][1], D[2][2] = l1,l2,l3
R[0][0], R[1][0], R[2][0] = d1,d2,d3
L[2][2], L[1][2], L[0][2] = u1,u2,u3
#U의 1행, D의 1행, R의 3열, L의 1열
elif i[0] == 'B':
B = turn(deepcopy(B), i[1])
u1,u2,u3 = U[0][0], U[0][1], U[0][2]
d1,d2,d3 = D[0][0], D[0][1], D[0][2]
r1,r2,r3 = R[0][2], R[1][2], R[2][2]
l1,l2,l3 = L[2][0], L[1][0], L[0][0]
if i[1] == '+':
U[0][0], U[0][1], U[0][2] = r1,r2,r3
D[0][0], D[0][1], D[0][2] = l1,l2,l3
R[0][2], R[1][2], R[2][2] = d1,d2,d3
L[2][0], L[1][0], L[0][0] = u1,u2,u3
elif i[1] == '-':
U[0][0], U[0][1], U[0][2] = l1,l2,l3
D[0][0], D[0][1], D[0][2] = r1,r2,r3
R[0][2], R[1][2], R[2][2] = u1,u2,u3
L[2][0], L[1][0], L[0][0] = d1,d2,d3
#U의 1열, D의 1열, F의 1열, B의 3열
elif i[0] == 'L':
L = turn(deepcopy(L), i[1])
u1,u2,u3 = U[0][0], U[1][0], U[2][0]
d1,d2,d3 = D[2][2], D[1][2], D[0][2]
f1,f2,f3 = F[0][0], F[1][0], F[2][0]
b1,b2,b3 = B[2][2], B[1][2], B[0][2]
if i[1] == '+':
U[0][0], U[1][0], U[2][0] = b1,b2,b3
D[2][2], D[1][2], D[0][2] = f1,f2,f3
F[0][0], F[1][0], F[2][0] = u1,u2,u3
B[2][2], B[1][2], B[0][2] = d1,d2,d3
elif i[1] == '-':
U[0][0], U[1][0], U[2][0] = f1,f2,f3
D[2][2], D[1][2], D[0][2] = b1,b2,b3
F[0][0], F[1][0], F[2][0] = d1,d2,d3
B[2][2], B[1][2], B[0][2] = u1,u2,u3
#U의 3열, D의 3열, F의 3열, B의 1열
elif i[0] == 'R':
R = turn(deepcopy(R), i[1])
u1,u2,u3 = U[0][2], U[1][2], U[2][2]
d1,d2,d3 = D[2][0], D[1][0], D[0][0]
f1,f2,f3 = F[0][2], F[1][2], F[2][2]
b1,b2,b3 = B[2][0], B[1][0], B[0][0]
if i[1] == '+':
U[0][2], U[1][2], U[2][2] = f1,f2,f3
D[2][0], D[1][0], D[0][0] = b1,b2,b3
F[0][2], F[1][2], F[2][2] = d1,d2,d3
B[2][0], B[1][0], B[0][0] = u1,u2,u3
elif i[1] == '-':
U[0][2], U[1][2], U[2][2] = b1,b2,b3
D[2][0], D[1][0], D[0][0] = f1,f2,f3
F[0][2], F[1][2], F[2][2] = u1,u2,u3
B[2][0], B[1][0], B[0][0] = d1,d2,d3
for i in range(3):
for j in range(3):
print(U[i][j], end = '')
print()
#행렬을 돌려서 결과를 반환하는 함수
def turn(array, dir):
new_array = [['0']*3 for _ in range(3)]
if dir == '+':
for i in range(3):
for j in range(3):
new_array[i][j] = array[2-j][i]
elif dir == '-':
for i in range(3):
for j in range(3):
new_array[i][j] = array[j][2-i]
return new_array
test_case = int(input())
for _ in range(test_case):
main()