[BOJ] Q5373 큐빙
[BOJ] Q5373 큐빙
Question
Language: Python
Difficulty: Platinum 5
3차원 구조를 가지는 큐브에 대해서, 각각의 면을 분리해서 회전을 고려해야한다.
각 면에 대한 회전을 수행할때, 아래의 2가지 회전이 발생한다
- 해당 면에 대한 회전
- 이 부분은 2차원 배열의 시계방향 회전, 시계 반대 방향 회전 함수를 통해 구현할 수 있다.
def clock_wise(list):
new_list=[[0] * 3 for _ in range(3)]
for i in range(3):
for j in range(3):
new_list[j][2-i]=list[i][j]
return new_list
def counter_clock_wise(list):
new_list=[[0] * 3 for _ in range(3)]
for i in range(3):
for j in range(3):
new_list[j][i]=list[i][2-j]
return new_list
- 해당 면을 둘러싸고 있는 4면에 대한 회전 각각의 면에 대해서 둘러싸고 있는 면들을 구해서 해당 면 간에 회전 연산을 구현해야한다.
가령 L의 경우를 살펴 보자
L 시계 방향
L 주위의 U,F,D,B 면 간에 회전이 발생한다
U면의 0열 -> F면의 0열 -> D면의 0열 -> B면의 2열
이때, 회전을 고려할때, 각 면의 시작점이 어디에 있는지 파악하는 것이 중요하다 그래서, B면과 D면간의 회전을 생각할때 시작 좌표가 다르기 때문에 역순으로 입력한다.
for i in range(3):
new_dice[2][i][0]=dice[0][i][0]
new_dice[1][i][0]=dice[2][i][0]
new_dice[3][i][2]=dice[1][2-i][0]
new_dice[0][i][0]=dice[3][2-i][2]
new_dice[4]=clock_wise(dice[4])
L 반시계 방향
L 주위의 U,F,D,B 면 간에 회전이 발생한다
B면의 2열 -> D면의 0열 -> F면의 0열 -> U면의 0열
for i in range(3):
new_dice[3][i][2]=dice[0][2-i][0]
new_dice[1][i][0]=dice[3][2-i][2]
new_dice[2][i][0]=dice[1][i][0]
new_dice[0][i][0]=dice[2][i][0]
new_dice[4]=counter_clock_wise(dice[4])
Solution
from copy import deepcopy
def clock_wise(list):
new_list=[[0] * 3 for _ in range(3)]
for i in range(3):
for j in range(3):
new_list[j][2-i]=list[i][j]
return new_list
def counter_clock_wise(list):
new_list=[[0] * 3 for _ in range(3)]
for i in range(3):
for j in range(3):
new_list[j][i]=list[i][2-j]
return new_list
def solution(operations):
#윗면,아랫면,앞면,뒷면,왼쪽면,오른쪽면
dice=[
[['w'] * 3 for _ in range(3)],
[['y'] * 3 for _ in range(3)],
[['r'] * 3 for _ in range(3)],
[['o'] * 3 for _ in range(3)],
[['g'] * 3 for _ in range(3)],
[['b'] * 3 for _ in range(3)]
]
for operation in operations:
new_dice=deepcopy(dice)
#윗면
if operation[0] == "U":
if operation[1]=="+":
for i in range(3):
new_dice[5][0][i]=dice[3][0][i]
new_dice[2][0][i]=dice[5][0][i]
new_dice[4][0][i]=dice[2][0][i]
new_dice[3][0][i]=dice[4][0][i]
new_dice[0]=clock_wise(dice[0])
if operation[1]=="-":
for i in range(3):
new_dice[4][0][i]=dice[3][0][i]
new_dice[2][0][i]=dice[4][0][i]
new_dice[5][0][i]=dice[2][0][i]
new_dice[3][0][i]=dice[5][0][i]
new_dice[0]=counter_clock_wise(dice[0])
#아랫면
if operation[0] == "D":
if operation[1]=="+":
for i in range(3):
new_dice[4][2][i]=dice[3][2][i]
new_dice[2][2][i]=dice[4][2][i]
new_dice[5][2][i]=dice[2][2][i]
new_dice[3][2][i]=dice[5][2][i]
new_dice[1]=clock_wise(dice[1])
if operation[1]=="-":
for i in range(3):
new_dice[5][2][i]=dice[3][2][i]
new_dice[2][2][i]=dice[5][2][i]
new_dice[4][2][i]=dice[2][2][i]
new_dice[3][2][i]=dice[4][2][i]
new_dice[1]=counter_clock_wise(dice[1])
#앞면
if operation[0] == "F":
if operation[1]=="+":
for i in range(3):
new_dice[5][i][0]=dice[0][2][i]
new_dice[1][0][i]=dice[5][2-i][0]
new_dice[4][i][2]=dice[1][0][i]
new_dice[0][2][i]=dice[4][2-i][2]
new_dice[2]=clock_wise(dice[2])
if operation[1]=="-":
for i in range(3):
new_dice[4][i][2]=dice[0][2][2-i]
new_dice[1][0][i]=dice[4][i][2]
new_dice[5][i][0]=dice[1][0][2-i]
new_dice[0][2][i]=dice[5][i][0]
new_dice[2]=counter_clock_wise(dice[2])
#뒷면
if operation[0] == "B":
if operation[1]=="+":
for i in range(3):
new_dice[4][i][0]=dice[0][0][2-i]
new_dice[1][2][i]=dice[4][i][0]
new_dice[5][i][2]=dice[1][2][2-i]
new_dice[0][0][i]=dice[5][i][2]
new_dice[3]=clock_wise(dice[3])
if operation[1]=="-":
for i in range(3):
new_dice[5][i][2]=dice[0][0][i]
new_dice[1][2][i]=dice[5][2-i][2]
new_dice[4][i][0]=dice[1][2][i]
new_dice[0][0][i]=dice[4][2-i][0]
new_dice[3]=counter_clock_wise(dice[3])
#왼쪽면
if operation[0] == "L":
if operation[1]=="+":
for i in range(3):
new_dice[2][i][0]=dice[0][i][0]
new_dice[1][i][0]=dice[2][i][0]
new_dice[3][i][2]=dice[1][2-i][0]
new_dice[0][i][0]=dice[3][2-i][2]
new_dice[4]=clock_wise(dice[4])
if operation[1]=="-":
for i in range(3):
new_dice[3][i][2]=dice[0][2-i][0]
new_dice[1][i][0]=dice[3][2-i][2]
new_dice[2][i][0]=dice[1][i][0]
new_dice[0][i][0]=dice[2][i][0]
new_dice[4]=counter_clock_wise(dice[4])
#오른쪽면
if operation[0] == "R":
if operation[1]=="+":
for i in range(3):
new_dice[3][i][0]=dice[0][2-i][2]
new_dice[1][i][2]=dice[3][2-i][0]
new_dice[2][i][2]=dice[1][i][2]
new_dice[0][i][2]=dice[2][i][2]
new_dice[5]=clock_wise(dice[5])
if operation[1]=="-":
for i in range(3):
new_dice[2][i][2]=dice[0][i][2]
new_dice[1][i][2]=dice[2][i][2]
new_dice[3][i][0]=dice[1][2-i][2]
new_dice[0][i][2]=dice[3][2-i][0]
new_dice[5]=counter_clock_wise(dice[5])
dice=new_dice
for i in range(3):
print("".join(dice[0][i]))
if __name__ == "__main__":
test_cases=int(input())
for _ in range(test_cases):
n_rotates=int(input())
operations=list(map(str,input().split()))
solution(operations)
댓글남기기