[bj5373] 큐빙

Brie·2024년 6월 11일

코테 연습

목록 보기
14/24

문제

  • 백준 URL: 큐빙
  • 난이도 플래티넘 5

풀이

다음과 같은 형태로 큐브를 일차원 배열에 저장하고, 필요한 부분만 가져와서 rotate 해주면 문제의 요구사항을 쉽게 구현할 수 있을 거라고 생각했다.

"""
         0  1  2 
         7  8  3 
         6  5  4 
9  10 11 18 19 20 27 28 29 36 37 38
16 17 12 25 26 21 34 35 30 43 44 39
15 14 13 24 23 22 33 32 31 42 41 40
         45 46 47
         52 53 48
         51 50 49
"""

유의해야할 사항은 큐브를 돌린다는 것은 다음의 요소에 대해 제어해야 한다는 것을 나타낸다.

  • 돌리는 면에 대한 8개의 요소
  • 돌리는 면의 가장자리에 대한 12개의 요소

또한, 돌리는 기준은 '돌리는 면을 바라보는 방향'을 기준으로 한다는 것이다. 예를 들어, 위의 큐브 순서도를 참조해서 아랫 면을 돌릴때는,
15 14 13 24 23 22 33 32 31 42 41 40
의 순서대로 회전을 하게 된다. 그러나, 윗 면을 돌릴때는
9 10 11 18 19 20 27 28 29 36 37 38의 순서가 아니라, 이의 역순으로 회전을 해주어야 한다.

이러한 부분을 고려하여 구현하면 정답을 받을 수 있다. 사실 디버깅이 귀찮은 문제지 구현이 어려운 문제는 아니다.

from collections import deque

r = range
def cubing(d,v):
    l,l2 = dic[d],dic2[d]
    dq = deque([cube[i] for i in l])
    dq2 = deque([cube[i] for i in l2])
    dq.rotate(3*v)
    dq2.rotate(2*v)
    for i in l:cube[i] = dq.popleft()
    for i in l2:cube[i] = dq2.popleft()

dic = {
    'U':[38,37,36,29,28,27,20,19,18,11,10,9],
    'D':[15,14,13,24,23,22,33,32,31,42,41,40],
    'L':[0,7,6,18,25,24,45,52,51,40,39,38],
    'R':[49,48,47,22,21,20,4,3,2,36,43,42],
    'B':[2,1,0,9,16,15,51,50,49,31,30,29],
    'F':[6,5,4,27,34,33,47,46,45,13,12,11]
}

dic2 = {
    'U':[*r(8)],
    'D':[*r(45,53)],
    'L':[*r(9,17)],
    'R':[*r(27,35)],
    'B':[*r(36,44)],
    'F':[*r(18,26)]
}

for _ in range(int(input())):
    cube = list('w'*9+'g'*9+'r'*9+'b'*9+'o'*9+'y'*9)
    n = int(input())
    for i in [*input().split()]:
        cubing(i[0],[-1,1][i[1]=='+'])
    for i in [[0,1,2],[7,8,3],[6,5,4]]:
        print(''.join([cube[j] for j in i]))

0개의 댓글