백준 5373번 큐빙 삼성 SW역량테스트 (Python)

전승재·2023년 8월 7일
0

알고리즘

목록 보기
13/88

백준 5373번 문제 바로가기

문제 이해

이 문제는 간단하게 말하면 맞춰진 큐브를 입력에서 주어진대로 회전시키고 그 때의 윗면의 색깔을 출력하면 되는 간단한 문제이다.

하지만 실제로는 간단하지가 않았다...
우선 큐브를 구현하고 큐브의 동작들을 생각하는 부분에서 많이 머리가 아팠다...
따라서 아래의 큐브 시뮬레이션 사이트를 통해서 큐브를 돌려보며 동작을 이해했다.
큐브시뮬레이션 사이트

문제 접근

우선 이 문제를 봤을 때 완전한 시뮬레이션, 구현 문제라는 것을 느꼈다.
따라서 나는 큐브의 동작에서 규칙을 찾으려고 노력했다.
하지만 계속 봤지만 규칙이 없어보였고 결국 6가지의 동작을 모두 구현해야겠다고 생각했다.

따라서 아래와 같이 단계를 나눴다.
1. 맞춰진 큐브를 생성하기
2. 큐브를 돌리는 함수 생성하기
3. 큐브 돌리고 윗면 출력하기

문제 풀이

1. 맞춰진 큐브를 생성하기

    for t in range(3):
        cube[0].append(['w','w','w']) #위
        cube[1].append(['y','y','y']) #아래
        cube[2].append(['r','r','r']) #앞
        cube[3].append(['o','o','o']) #뒤
        cube[4].append(['g','g','g']) #왼
        cube[5].append(['b','b','b']) #오

3차원 배열을 선언했다.

2. 큐브를 돌리는 함수 생성하기

큐브를 회전시키면 돌아가는 면도 돌아가게 된다. 따라서 아래의 사진과 같은 모양으로 회전한다.

위의 동작을 수행하는 함수를 만들었다.

def turn_itselt(i):
    global cube
    temp = cube[i][0][0]
    cube[i][0][0] = cube[i][2][0]
    cube[i][2][0] = cube[i][2][2]
    cube[i][2][2] = cube[i][0][2]
    cube[i][0][2] = temp
    temp = cube[i][0][1]
    cube[i][0][1] = cube[i][1][0]
    cube[i][1][0] = cube[i][2][1]
    cube[i][2][1] = cube[i][1][2]
    cube[i][1][2] = temp

아래는 6가지의 면의 동작을 수행했을 때의 색깔이 어떻게 변하는지를 생각하면서 그린 그림이다.
이렇게만 해서 해결되면 너무 좋겠지만 인덱스가 반전되어서 이동하는 부분도 있었기 때문에 6가지의 면의 동작을 하나씩 생각하면서 그려야했기에 시간이 정말 많이 걸렸던 것 같다....
만약 코딩테스트에 이런 문제가 나왔다면 다른 문제부터 푸는걸 추천한다..!
(참고로 반시계방향으로 회전하는 건 시계방향으로 3번 회전하면 되기 때문에 따로 구하지 않았다. 아마 그거까지 했으면 오늘 밤샜다.......)

def turn(side, direction):
    if direction == '+':
        if side == 'U': 
            turn_itselt(0) # 위
            temp = cube[2][0]
            cube[2][0] = cube[5][0]
            cube[5][0] = cube[3][0]
            cube[3][0] = cube[4][0]
            cube[4][0] = temp
            
        if side == 'F':
            turn_itselt(2) # 앞
            temp = cube[0][2]
            cube[0][2] = [cube[4][2][2],cube[4][1][2],cube[4][0][2]]
            cube[4][0][2],cube[4][1][2],cube[4][2][2] = [cube[1][0][0],cube[1][0][1],cube[1][0][2]]
            cube[1][0][0],cube[1][0][1],cube[1][0][2] = [cube[5][2][0],cube[5][1][0],cube[5][0][0]]
            cube[5][0][0],cube[5][1][0],cube[5][2][0] = [temp[0], temp[1], temp[2]]
        if side == 'R':
            turn_itselt(5) # 오른쪽
            temp = [cube[0][0][2],cube[0][1][2],cube[0][2][2]]
            cube[0][0][2],cube[0][1][2],cube[0][2][2] = [cube[2][0][2],cube[2][1][2],cube[2][2][2]]
            cube[2][0][2],cube[2][1][2],cube[2][2][2] = [cube[1][0][2],cube[1][1][2],cube[1][2][2]]
            cube[1][0][2],cube[1][1][2],cube[1][2][2] = [cube[3][2][0],cube[3][1][0],cube[3][0][0]]
            cube[3][2][0],cube[3][1][0],cube[3][0][0] = [temp[0], temp[1], temp[2]]
        if side == 'B':
            turn_itselt(3) #뒤
            temp = cube[0][0]
            cube[0][0] = [cube[5][0][2],cube[5][1][2],cube[5][2][2]]
            cube[5][0][2],cube[5][1][2],cube[5][2][2] = [cube[1][2][2],cube[1][2][1],cube[1][2][0]]
            cube[1][2][2],cube[1][2][1],cube[1][2][0] = [cube[4][2][0],cube[4][1][0],cube[4][0][0]]
            cube[4][2][0],cube[4][1][0],cube[4][0][0] = [temp[0], temp[1], temp[2]]
        if side == 'L':
            turn_itselt(4) # 왼쪽 
            temp = [cube[0][0][0],cube[0][1][0],cube[0][2][0]]
            cube[0][2][0],cube[0][1][0],cube[0][0][0] = [cube[3][0][2],cube[3][1][2],cube[3][2][2]] # 반전
            cube[3][0][2],cube[3][1][2],cube[3][2][2] = [cube[1][2][0],cube[1][1][0],cube[1][0][0]] # 반전
            cube[1][0][0],cube[1][1][0],cube[1][2][0] = [cube[2][0][0],cube[2][1][0],cube[2][2][0]]
            cube[2][0][0],cube[2][1][0],cube[2][2][0] = [temp[0], temp[1], temp[2]] #반전
        if side == 'D':
            turn_itselt(1)
            temp = cube[2][2]
            cube[2][2] = cube[4][2]
            cube[4][2] = cube[3][2]
            cube[3][2] = cube[5][2]
            cube[5][2] = temp
    elif direction == '-':
        turn(side,'+')
        turn(side,'+')
        turn(side,'+')

3. 큐브 돌리고 윗면 출력하기

테스트 케이스 다 넣어주고 cube를 출력해주면 된다!

testcase = list(map(str, sys.stdin.readline().rstrip().split())) # testcase 저장
    for test in testcase:
        turn(test[0], test[1])
    for i in range(3):
        for j in range(3):
            print(cube[0][i][j], end="")
        print()

제출 코드

import sys
def turn_itselt(i):
    global cube
    temp = cube[i][0][0]
    cube[i][0][0] = cube[i][2][0]
    cube[i][2][0] = cube[i][2][2]
    cube[i][2][2] = cube[i][0][2]
    cube[i][0][2] = temp
    temp = cube[i][0][1]
    cube[i][0][1] = cube[i][1][0]
    cube[i][1][0] = cube[i][2][1]
    cube[i][2][1] = cube[i][1][2]
    cube[i][1][2] = temp
def turn(side, direction):
    if direction == '+':
        if side == 'U': 
            turn_itselt(0) # 위
            temp = cube[2][0]
            cube[2][0] = cube[5][0]
            cube[5][0] = cube[3][0]
            cube[3][0] = cube[4][0]
            cube[4][0] = temp
            
        if side == 'F':
            turn_itselt(2) # 앞
            temp = cube[0][2]
            cube[0][2] = [cube[4][2][2],cube[4][1][2],cube[4][0][2]]
            cube[4][0][2],cube[4][1][2],cube[4][2][2] = [cube[1][0][0],cube[1][0][1],cube[1][0][2]]
            cube[1][0][0],cube[1][0][1],cube[1][0][2] = [cube[5][2][0],cube[5][1][0],cube[5][0][0]]
            cube[5][0][0],cube[5][1][0],cube[5][2][0] = [temp[0], temp[1], temp[2]]
        if side == 'R':
            turn_itselt(5) # 오른쪽
            temp = [cube[0][0][2],cube[0][1][2],cube[0][2][2]]
            cube[0][0][2],cube[0][1][2],cube[0][2][2] = [cube[2][0][2],cube[2][1][2],cube[2][2][2]]
            cube[2][0][2],cube[2][1][2],cube[2][2][2] = [cube[1][0][2],cube[1][1][2],cube[1][2][2]]
            cube[1][0][2],cube[1][1][2],cube[1][2][2] = [cube[3][2][0],cube[3][1][0],cube[3][0][0]]
            cube[3][2][0],cube[3][1][0],cube[3][0][0] = [temp[0], temp[1], temp[2]]
        if side == 'B':
            turn_itselt(3) #뒤
            temp = cube[0][0]
            cube[0][0] = [cube[5][0][2],cube[5][1][2],cube[5][2][2]]
            cube[5][0][2],cube[5][1][2],cube[5][2][2] = [cube[1][2][2],cube[1][2][1],cube[1][2][0]]
            cube[1][2][2],cube[1][2][1],cube[1][2][0] = [cube[4][2][0],cube[4][1][0],cube[4][0][0]]
            cube[4][2][0],cube[4][1][0],cube[4][0][0] = [temp[0], temp[1], temp[2]]
        if side == 'L':
            turn_itselt(4) # 왼쪽 
            temp = [cube[0][0][0],cube[0][1][0],cube[0][2][0]]
            cube[0][2][0],cube[0][1][0],cube[0][0][0] = [cube[3][0][2],cube[3][1][2],cube[3][2][2]] # 반전
            cube[3][0][2],cube[3][1][2],cube[3][2][2] = [cube[1][2][0],cube[1][1][0],cube[1][0][0]] # 반전
            cube[1][0][0],cube[1][1][0],cube[1][2][0] = [cube[2][0][0],cube[2][1][0],cube[2][2][0]]
            cube[2][0][0],cube[2][1][0],cube[2][2][0] = [temp[0], temp[1], temp[2]] #반전
        if side == 'D':
            turn_itselt(1)
            temp = cube[2][2]
            cube[2][2] = cube[4][2]
            cube[4][2] = cube[3][2]
            cube[3][2] = cube[5][2]
            cube[5][2] = temp
    elif direction == '-':
        turn(side,'+')
        turn(side,'+')
        turn(side,'+')
N = int(sys.stdin.readline())
for _ in range(N):
    Tastcase_N = int(sys.stdin.readline())
    cube = [[] for t in range(6)]
    for t in range(3):
        cube[0].append(['w','w','w'])
        cube[1].append(['y','y','y'])
        cube[2].append(['r','r','r'])
        cube[3].append(['o','o','o'])
        cube[4].append(['g','g','g'])
        cube[5].append(['b','b','b'])
    testcase = list(map(str, sys.stdin.readline().rstrip().split())) # testcase 저장
    for test in testcase:
        turn(test[0], test[1])
    for i in range(3):
        for j in range(3):
            print(cube[0][i][j], end="")
        print()

0개의 댓글