[BOJ] 5373 - 큐빙

김우경·2021년 4월 16일
0

삼성기출

목록 보기
22/37

문제 링크

5373 - 큐빙

문제 설명

3*3*3 크기의 삼차원 퍼즐이 있다. 흔히 맞춰본 큐브라고 생각하면 된다. 각 면은 양방향으로 90도씩 회전이 가능하고, 초기는 윗면은 흰색, 아래는 노란색, 앞은 빨간색, 뒤는 오렌지색, 왼쪽은 초록색, 오른쪽은 파란색인 풀린 상태이다. 큐브를 돌린 순서가 주어질때, 다 돌리고 난 뒤 가장윗면의 색은?

문제 풀이

설계를 조져서,, 한 문제 이렇게 오래 푼건 처음인것 같다,,
풀긴 풀었는데 되는데로 디버깅하면서 고쳐논거라 누구 보여주기 부끄러운 코드 ^_ㅠ,, 다음주쯤 어떻게 풀었는지 잊어버릴때쯤 다시 풀어봐야겠다 효,,

import sys
from collections import deque

input = sys.stdin.readline

color = {0:'w', 1:'y', 2:'r', 3:'o', 4:'g', 5:'b'}
# 각 면을 회전시킬때 좌표를 바꿔줘야 하는 면들
rotation_target = {
    0:[3,4,2,5], 
    3:[0,5,1,4], 
    1:[3,5,2,4], 
    2:[0,4,1,5], 
    4:[0,3,1,2],
    5:[0,2,1,3]
}
# 위의 좌표 바꿔줘야 하는 면들의 인덱스
rotation_idx = {
        0: [2,1,0,2,1,0,2,1,0,2,1,0], 
        1: [6,7,8,6,7,8,6,7,8,6,7,8], 
        2: [8,7,6,2,5,8,8,7,6,6,3,0], 
        3: [0,1,2,2,5,8,0,1,2,6,3,0],
        4: [6,3,0,2,5,8,2,5,8,6,3,0],
        5: [2,5,8,2,5,8,6,3,0,6,3,0]
}
side_num = {'U':0, 'D':1, 'F':2, 'B':3, 'L':4, 'R':5}

def rotate(side, direction):
    rotation_list = rotation_target[side] # 돌릴 면들
    lst = deque()
    
    for r in range(len(rotation_list)):
        for i in range(r*3, r*3+3):
            lst.append(cube[rotation_list[r]][rotation_idx[side][i]])

    if direction == '-':
        # 시계방향으로 3번 이동
        for _ in range(3):
            m = lst.pop()
            lst.appendleft(m)
    else:
        # 시계방향으로 3번 이동
        for _ in range(3):
            m = lst.popleft()
            lst.append(m)

    # 다시 맞게 넣어주기 
    for r in range(len(rotation_list)):
        for i in range(r*3, r*3+3):
            cube[rotation_list[r]][rotation_idx[side][i]] = lst.popleft()
    
    # 기준면도 회전
    tmp = []
    for i in range(0, len(cube[side]), 3):
        tmp.append(cube[side][i:i+3])
    n = len(tmp)
    m = len(tmp[0])
    result = [[0]* n for _ in range(m)]
    if direction == '+':
        # 시계방향으로
        for i in range(n):
            for j in range(m):
                result[j][n-i-1] = tmp[i][j]
    else:
        # 반시계방향으로
        for i in range(n):
            for j in range(m):
                result[n-1-j][i] = tmp[i][j]

    for i in range(n):
        for j in range(m):
            cube[side][3*i+j] = result[i][j]

N = int(input())
for _ in range(N):
    cube = [
    [0 for _ in range(9)], [1 for _ in range(9)], 
    [2 for _ in range(9)], [3 for _ in range(9)], 
    [4 for _ in range(9)], [5 for _ in range(9)]
    ]

    n = int(input().strip()) # 큐브 n번 회전
    rotations = input().split()
    
    for r in rotations:
        rotate(side_num[r[0]], r[1])
    c = 0
    for _ in range(3):
        for i in range(c, c+3):
            print(color[cube[0][i]], end='')
        c += 3
        print()
profile
Hongik CE

0개의 댓글