[코딩테스트][백준] 🔥 백준 5373번 "큐빙" 문제: Python으로 완벽 해결하기! 🔥

김상욱·2024년 9월 18일
0
post-thumbnail

문제 링크

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

🕒 Python 풀이시간: 35분

def turnCover(arr):
    new_arr=[[0]*3 for _ in range(3)]
    for i in range(3):
        for j in range(3):
            new_arr[j][2-i]=arr[i][j]
    return new_arr

def turn(side,k):
    global front,back,left,right,up,down
    for _ in range(k):
        if side=='U':
            up=turnCover(up)
            tmp1,tmp2,tmp3=front[0][0],front[0][1],front[0][2]
            front[0][0],front[0][1],front[0][2]=right[0][0],right[0][1],right[0][2]
            right[0][0],right[0][1],right[0][2]=back[0][0],back[0][1],back[0][2]
            back[0][0],back[0][1],back[0][2]=left[0][0],left[0][1],left[0][2]
            left[0][0],left[0][1],left[0][2]=tmp1,tmp2,tmp3
        if side=='D':
            down=turnCover(down)
            tmp1,tmp2,tmp3=front[2][0],front[2][1],front[2][2]
            front[2][0],front[2][1],front[2][2]=left[2][0],left[2][1],left[2][2]
            left[2][0],left[2][1],left[2][2]=back[2][0],back[2][1],back[2][2]
            back[2][0],back[2][1],back[2][2]=right[2][0],right[2][1],right[2][2]
            right[2][0],right[2][1],right[2][2]=tmp1,tmp2,tmp3
        if side=='F':
            front=turnCover(front)
            tmp1,tmp2,tmp3=down[0][0],down[0][1],down[0][2]
            down[0][0],down[0][1],down[0][2]=right[2][0],right[1][0],right[0][0]
            right[2][0],right[1][0],right[0][0]=up[2][2],up[2][1],up[2][0]
            up[2][2],up[2][1],up[2][0]=left[0][2],left[1][2],left[2][2]
            left[0][2],left[1][2],left[2][2]=tmp1,tmp2,tmp3
        if side=='B':
            back=turnCover(back)
            tmp1,tmp2,tmp3=down[2][2],down[2][1],down[2][0]
            down[2][2],down[2][1],down[2][0]=left[2][0],left[1][0],left[0][0]
            left[2][0],left[1][0],left[0][0]=up[0][0],up[0][1],up[0][2]
            up[0][0],up[0][1],up[0][2]=right[0][2],right[1][2],right[2][2]
            right[0][2],right[1][2],right[2][2]=tmp1,tmp2,tmp3
        if side=='L':
            left=turnCover(left)
            tmp1,tmp2,tmp3=down[2][0],down[1][0],down[0][0]
            down[2][0],down[1][0],down[0][0]=front[2][0],front[1][0],front[0][0]
            front[2][0],front[1][0],front[0][0]=up[2][0],up[1][0],up[0][0]
            up[2][0],up[1][0],up[0][0]=back[0][2],back[1][2],back[2][2]
            back[0][2],back[1][2],back[2][2]=tmp1,tmp2,tmp3
        if side=='R':
            right=turnCover(right)
            tmp1,tmp2,tmp3=down[0][2],down[1][2],down[2][2]
            down[0][2],down[1][2],down[2][2]=back[2][0],back[1][0],back[0][0]
            back[2][0],back[1][0],back[0][0]=up[0][2],up[1][2],up[2][2]
            up[0][2],up[1][2],up[2][2]=front[0][2],front[1][2],front[2][2]
            front[0][2],front[1][2],front[2][2]=tmp1,tmp2,tmp3

for tc in range(int(input())):
    front=[['r']*3 for _ in range(3)]
    back=[['o']*3 for _ in range(3)]
    left=[['g']*3 for _ in range(3)]
    right=[['b']*3 for _ in range(3)]
    up=[['w']*3 for _ in range(3)]
    down=[['y']*3 for _ in range(3)]
    n=int(input())

    opers=input().split()

    for oper in opers:
        side=oper[0]
        dir=oper[1]
        if dir=='+':
            turn(side,1)
        else:
            turn(side,3)
    for i in range(3):
        print(''.join(up[i]))

큐브 회전 시뮬레이션 문제! 🎲🔄

큐브를 말그대로 시뮬레이션 하면서 돌리면 어떻게 되는지를 보는 문제이다. 이 때, 알아두면 좋은 점이 한방향으로 3번 돌리면 반대 방향으로 한번 돌린 것과 같다는 것이다. 그렇기에 각 명령을 받았을 때 이를 이용하면 간단히 풀 수 있다.

또한 방향과 회전 시의 움직임이 헷갈리기 때문에 전개도를 하나 그려놓고 하는 것이 편하다. 전개도를 그려놓고 회전 시의 움직이는 블록들을 표시해가면서 하면 수월하다. 마지막으로, 모든 회전이 끝났을 때의 답을 단순히 출력하면 된다.

이렇게 Python으로 백준의 "큐빙" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글