백준 5373 - 큐빙 (Python)

2024. 1. 31. 02:22알고리즘

문제

https://www.acmicpc.net/problem/5373

 

5373번: 큐빙

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란

www.acmicpc.net

풀이

import sys
input = sys.stdin.readline
t = int(input())
sides = {'U':0,'L':1,'F':2,'R':3,'B':4,'D':5}
def turn(code):
    side = sides[code[0]]
    direction = code[1]
    for i in range(1 if direction == '-' else 3):
        for j in range(2):
            #해당 면 돌리기
            temp = cube[side][0][0]
            cube[side][0][0] = cube[side][0][1]
            cube[side][0][1] = cube[side][0][2]
            cube[side][0][2] = cube[side][1][2]
            cube[side][1][2] = cube[side][2][2]
            cube[side][2][2] = cube[side][2][1]
            cube[side][2][1] = cube[side][2][0]
            cube[side][2][0] = cube[side][1][0]
            cube[side][1][0] = temp
        for j in range(3):
            #옆면 돌리기
            if side ==0:
                temp = cube[4][0][2]
                cube[4][0][2] = cube[4][0][1]
                cube[4][0][1] = cube[4][0][0]
                cube[4][0][0] = cube[3][0][2]
                cube[3][0][2] = cube[3][0][1]
                cube[3][0][1] = cube[3][0][0]
                cube[3][0][0] = cube[2][0][2]
                cube[2][0][2] = cube[2][0][1]
                cube[2][0][1] = cube[2][0][0]
                cube[2][0][0] = cube[1][0][2]
                cube[1][0][2] = cube[1][0][1]
                cube[1][0][1] = cube[1][0][0]
                cube[1][0][0] = temp
            elif side ==1:
                temp = cube[0][0][0]
                cube[0][0][0] = cube[0][1][0]
                cube[0][1][0] = cube[0][2][0]
                cube[0][2][0] = cube[2][0][0]
                cube[2][0][0] = cube[2][1][0]
                cube[2][1][0] = cube[2][2][0]
                cube[2][2][0] = cube[5][0][0]
                cube[5][0][0] = cube[5][1][0]
                cube[5][1][0] = cube[5][2][0]
                cube[5][2][0] = cube[4][2][2]
                cube[4][2][2] = cube[4][1][2]
                cube[4][1][2] = cube[4][0][2]
                cube[4][0][2] = temp
            elif side ==2:
                temp = cube[0][2][0]
                cube[0][2][0] = cube[0][2][1]
                cube[0][2][1] = cube[0][2][2]
                cube[0][2][2] = cube[3][0][0]
                cube[3][0][0] = cube[3][1][0]
                cube[3][1][0] = cube[3][2][0]
                cube[3][2][0] = cube[5][0][2]
                cube[5][0][2] = cube[5][0][1]
                cube[5][0][1] = cube[5][0][0]
                cube[5][0][0] = cube[1][2][2]
                cube[1][2][2] = cube[1][1][2]
                cube[1][1][2] = cube[1][0][2]
                cube[1][0][2] = temp
            elif side ==3:
                temp = cube[0][2][2]
                cube[0][2][2] = cube[0][1][2]
                cube[0][1][2] = cube[0][0][2]
                cube[0][0][2] = cube[4][0][0]
                cube[4][0][0] = cube[4][1][0]
                cube[4][1][0] = cube[4][2][0]
                cube[4][2][0] = cube[5][2][2]
                cube[5][2][2] = cube[5][1][2]
                cube[5][1][2] = cube[5][0][2]
                cube[5][0][2] = cube[2][2][2]
                cube[2][2][2] = cube[2][1][2]
                cube[2][1][2] = cube[2][0][2]
                cube[2][0][2] = temp
            elif side ==4:
                temp = cube[0][0][2]
                cube[0][0][2] = cube[0][0][1]
                cube[0][0][1] = cube[0][0][0]
                cube[0][0][0] = cube[1][0][0]
                cube[1][0][0] = cube[1][1][0]
                cube[1][1][0] = cube[1][2][0]
                cube[1][2][0] = cube[5][2][0]
                cube[5][2][0] = cube[5][2][1]
                cube[5][2][1] = cube[5][2][2]
                cube[5][2][2] = cube[3][2][2]
                cube[3][2][2] = cube[3][1][2]
                cube[3][1][2] = cube[3][0][2]
                cube[3][0][2] = temp
            elif side ==5:
                temp = cube[1][2][0]
                cube[1][2][0] = cube[1][2][1]
                cube[1][2][1] = cube[1][2][2]
                cube[1][2][2] = cube[2][2][0]
                cube[2][2][0] = cube[2][2][1]
                cube[2][2][1] = cube[2][2][2]
                cube[2][2][2] = cube[3][2][0]
                cube[3][2][0] = cube[3][2][1]
                cube[3][2][1] = cube[3][2][2]
                cube[3][2][2] = cube[4][2][0]
                cube[4][2][0] = cube[4][2][1]
                cube[4][2][1] = cube[4][2][2]
                cube[4][2][2] = temp
    
for testcase in range(t):
    n = int(input())
    turns = input().split()
    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']]
        ]
    for t in turns:
        turn(t)

 

이전에 큐브 타이머를 만든 적이 있어서 그때 썼던 로직을 조금 응용하였다.

(이전에 만든 큐브 타이머:  https://jamie2779.github.io/cubeTimer/ )

 

cube라는 3차원 리스트를 만들어서 아래 전개도 처럼 각 셀을 표시해주었다.

각 셀은 색상에 따라 "w",  "g", "r", "b", "o", "y" 중 하나의 값을 넣어주었다.

 

turn(code)라는 함수를 만들어서 회전기호에 맞게 리스트의 값을 반시계 방향으로 바꾸어 주는 로직을 구현하였다.

회전기호가 - 라면 반시계 방향으로 1회, +라면 반시계 방향으로 3회 회전을 시켜준다

 

테스트케이스가 여러 개이고 입력을 많이 받으므로 느린 input 대신 sys.stdin.readline 으로 입력을 받아주었고,

입력을 받은 뒤에는 해당 회전을 수행하고 윗면인 cube[0]을 형식에 맞게출력해주었다.

 

회전을 직접 인덱스로 일일이 지정해주다 보니 회전 방향과 횟수에 대한 실수 때문에 확인하는데 시간이 꽤 들었다.