[Python][백준] 5373번 큐빙

신남·2022년 9월 14일

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

공부 날짜 : 2022.09.14
정답 참조 여부 : O

루빅스 큐브를 입력순서대로 회전시켰을때 윗면의 모양을 출력하는 문제이다.


알고리즘이 아닌 내용 그대로 구현만하면 되는 문제로
당신이 작성한 코드가 틀려서 구글에 검색해봤다면 당신이 생각한 방법이 맞으니
정답을 보는것보다 처음부터 짜는게 나을수도 있다. 보고 이해하는 시간보다 생각한대로 처음부터 다시구현하는게 빠를 수 있다.

이런 종류의 문제는 내용이 어렵다기 보다 많이 헷갈리고 실수가 발생해서 틀리는 경우가 많고 만일 틀렸을경우 어디서 틀렸는지 찾는것 조차 굉장히 어렵기 때문에 개인적으로 정말 싫어하는 문제이다.

소스코드

import sys
from copy import deepcopy
input = sys.stdin.readline

#테스트 케이스 수만큼 반복하는 함수
def main():
    U = [['w']*3 for _ in range(3)]
    D = [['y']*3 for _ in range(3)]
    F = [['r']*3 for _ in range(3)]
    B = [['o']*3 for _ in range(3)]
    L = [['g']*3 for _ in range(3)]
    R = [['b']*3 for _ in range(3)]
    
    #돌릴 횟수
    n = int(input())
    
    #돌려야 하는 방법
    pass_ = list(input().split())
    
    for i in pass_:
        #F,B,R,L의 1행 돌리기
        if i[0] == 'U':
            U = turn(deepcopy(U), i[1])
            f1,f2,f3 = F[0][0], F[0][1], F[0][2]
            l1,l2,l3 = L[0][0], L[0][1], L[0][2]
            b1,b2,b3 = B[0][0], B[0][1], B[0][2]
            r1,r2,r3 = R[0][0], R[0][1], R[0][2]
            if i[1] == '+':
                F[0][0], F[0][1], F[0][2] = r1,r2,r3
                L[0][0], L[0][1], L[0][2] = f1,f2,f3
                B[0][0], B[0][1], B[0][2] = l1,l2,l3
                R[0][0], R[0][1], R[0][2] = b1,b2,b3
            elif i[1] == '-':
                F[0][0], F[0][1], F[0][2] = l1,l2,l3
                L[0][0], L[0][1], L[0][2] = b1,b2,b3
                B[0][0], B[0][1], B[0][2] = r1,r2,r3
                R[0][0], R[0][1], R[0][2] = f1,f2,f3
                
        #F,B,R,L의 3행 돌리기
        elif i[0] == 'D':
            D = turn(deepcopy(D), i[1])
            f1,f2,f3 = F[2][0], F[2][1], F[2][2]
            b1,b2,b3 = B[2][0], B[2][1], B[2][2]
            r1,r2,r3 = R[2][0], R[2][1], R[2][2]
            l1,l2,l3 = L[2][0], L[2][1], L[2][2]
            if i[1] == '+':
                F[2][0], F[2][1], F[2][2] = l1,l2,l3
                B[2][0], B[2][1], B[2][2] = r1,r2,r3
                R[2][0], R[2][1], R[2][2] = f1,f2,f3
                L[2][0], L[2][1], L[2][2] = b1,b2,b3
            elif i[1] == '-':
                F[2][0], F[2][1], F[2][2] = r1,r2,r3
                B[2][0], B[2][1], B[2][2] = l1,l2,l3
                R[2][0], R[2][1], R[2][2] = b1,b2,b3
                L[2][0], L[2][1], L[2][2] = f1,f2,f3
            
        #U의 3행, D의 3행, R의 1열 L의 3열
        elif i[0] == 'F':
            F = turn(deepcopy(F), i[1])
            u1,u2,u3 = U[2][0], U[2][1], U[2][2]
            d1,d2,d3 = D[2][0], D[2][1], D[2][2]
            r1,r2,r3 = R[0][0], R[1][0], R[2][0]
            l1,l2,l3 = L[2][2], L[1][2], L[0][2]
            if i[1] == '+':
                U[2][0], U[2][1], U[2][2] = l1,l2,l3
                D[2][0], D[2][1], D[2][2] = r1,r2,r3
                R[0][0], R[1][0], R[2][0] = u1,u2,u3
                L[2][2], L[1][2], L[0][2] = d1,d2,d3
            elif i[1] == '-':
                U[2][0], U[2][1], U[2][2] = r1,r2,r3
                D[2][0], D[2][1], D[2][2] = l1,l2,l3
                R[0][0], R[1][0], R[2][0] = d1,d2,d3
                L[2][2], L[1][2], L[0][2] = u1,u2,u3
                
        #U의 1행, D의 1행, R의 3열, L의 1열
        elif i[0] == 'B':
            B = turn(deepcopy(B), i[1])
            u1,u2,u3 = U[0][0], U[0][1], U[0][2]
            d1,d2,d3 = D[0][0], D[0][1], D[0][2]
            r1,r2,r3 = R[0][2], R[1][2], R[2][2]
            l1,l2,l3 = L[2][0], L[1][0], L[0][0]
            if i[1] == '+':
                U[0][0], U[0][1], U[0][2] = r1,r2,r3
                D[0][0], D[0][1], D[0][2] = l1,l2,l3
                R[0][2], R[1][2], R[2][2] = d1,d2,d3
                L[2][0], L[1][0], L[0][0] = u1,u2,u3
            elif i[1] == '-':
                U[0][0], U[0][1], U[0][2] = l1,l2,l3
                D[0][0], D[0][1], D[0][2] = r1,r2,r3
                R[0][2], R[1][2], R[2][2] = u1,u2,u3
                L[2][0], L[1][0], L[0][0] = d1,d2,d3
                
        #U의 1열, D의 1열, F의 1열, B의 3열
        elif i[0] == 'L':
            L = turn(deepcopy(L), i[1])
            u1,u2,u3 = U[0][0], U[1][0], U[2][0]
            d1,d2,d3 = D[2][2], D[1][2], D[0][2]
            f1,f2,f3 = F[0][0], F[1][0], F[2][0]
            b1,b2,b3 = B[2][2], B[1][2], B[0][2]
            if i[1] == '+':
                U[0][0], U[1][0], U[2][0] = b1,b2,b3
                D[2][2], D[1][2], D[0][2] = f1,f2,f3
                F[0][0], F[1][0], F[2][0] = u1,u2,u3
                B[2][2], B[1][2], B[0][2] = d1,d2,d3
            elif i[1] == '-':
                U[0][0], U[1][0], U[2][0] = f1,f2,f3
                D[2][2], D[1][2], D[0][2] = b1,b2,b3
                F[0][0], F[1][0], F[2][0] = d1,d2,d3
                B[2][2], B[1][2], B[0][2] = u1,u2,u3
            
        #U의 3열, D의 3열, F의 3열, B의 1열
        elif i[0] == 'R':
            R = turn(deepcopy(R), i[1])
            u1,u2,u3 = U[0][2], U[1][2], U[2][2]
            d1,d2,d3 = D[2][0], D[1][0], D[0][0]
            f1,f2,f3 = F[0][2], F[1][2], F[2][2]
            b1,b2,b3 = B[2][0], B[1][0], B[0][0]
            if i[1] == '+':
                U[0][2], U[1][2], U[2][2] = f1,f2,f3
                D[2][0], D[1][0], D[0][0] = b1,b2,b3
                F[0][2], F[1][2], F[2][2] = d1,d2,d3
                B[2][0], B[1][0], B[0][0] = u1,u2,u3
            elif i[1] == '-':
                U[0][2], U[1][2], U[2][2] = b1,b2,b3
                D[2][0], D[1][0], D[0][0] = f1,f2,f3
                F[0][2], F[1][2], F[2][2] = u1,u2,u3
                B[2][0], B[1][0], B[0][0] = d1,d2,d3
                

                    
    for i in range(3):
        for j in range(3):
            print(U[i][j], end = '')
        print()

                

    
#행렬을 돌려서 결과를 반환하는 함수    
def turn(array, dir):
    new_array = [['0']*3 for _ in range(3)]
    
    if dir == '+':
        for i in range(3):
            for j in range(3):
                new_array[i][j] = array[2-j][i]
                
                
    elif dir == '-': 
        for i in range(3):
            for j in range(3):
                new_array[i][j] = array[j][2-i]
                
                
    return new_array
    


    
    
    
test_case = int(input())

for _ in range(test_case):
    main()
    

0개의 댓글