백준 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]을 형식에 맞게출력해주었다.
회전을 직접 인덱스로 일일이 지정해주다 보니 회전 방향과 횟수에 대한 실수 때문에 확인하는데 시간이 꽤 들었다.