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

 

5373번: 큐빙

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

www.acmicpc.net

접근

문제를 읽고 머리에 떠오르는 그 방법(각 면을 큐빙하는 함수를 따로 작성하는 것)을 실제로 해야하는지, 아니면 조금 더 간단하게 할 수 있는 방법이 있는지 고민하다가 떠오르는 방법으로 설계했는데, 결국 코드의 길이나 복잡함이 더 좋아지진 않은 것 같다.

각 면을 큐빙하는 함수를 각각 작성하고 싶지 않아 큐빙하는 면을 전면 1개로 고정하고, 큐브 전체를 위, 아래, 왼쪽, 오른쪽으로 회전시키는 함수를 작성하였다.
즉, 후면을 큐빙하기 위해서는 큐브를 위로 두번 회전시키고, 이제 전면이 된 후면을 큐빙해준다. 그리고 아래로 두번 회전시켜 제자리로 이동하는 식이다.

결국 코드의 복잡함은 딱히 다른 코드에 비해 더 좋지도 나쁘지도 않은 것 같지만, 문제를 해결하였으므로 그대로 밀고나가기로 하였다.

코드

def turn_face(face, direction):
    # 입력된(face) 면 1개면을 시계, 혹은 반시계 방향으로 회전
    if direction == 1:
        tmp1, tmp2 = cube[face][0][0], cube[face][0][1]
        cube[face][0][0], cube[face][0][1] = cube[face][2][0], cube[face][1][0]
        cube[face][2][0], cube[face][1][0] = cube[face][2][2], cube[face][2][1]
        cube[face][2][2], cube[face][2][1] = cube[face][0][2], cube[face][1][2]
        cube[face][0][2], cube[face][1][2] = tmp1, tmp2
    elif direction == -1:
        tmp1, tmp2 = cube[face][0][0], cube[face][0][1]
        cube[face][0][0], cube[face][0][1] = cube[face][0][2], cube[face][1][2]
        cube[face][0][2], cube[face][1][2] = cube[face][2][2], cube[face][2][1]
        cube[face][2][2], cube[face][2][1] = cube[face][2][0], cube[face][1][0]
        cube[face][2][0], cube[face][1][0] = tmp1, tmp2


def turn_cube(direction):
    # 큐브의 앞면을 반시계, 시계 방향으로 회전 시킴
    if direction == 1:
        # 시계 방향, 앞면을 기준으로 윗면, 왼쪽면, 오른쪽면, 아랫면 1줄씩 이동
        tmp1, tmp2, tmp3 = cube[0][2][0], cube[0][2][1], cube[0][2][2]
        cube[0][2][0], cube[0][2][1], cube[0][2][2] = cube[4][2][2], cube[4][1][2], cube[4][0][2]
        cube[4][2][2], cube[4][1][2], cube[4][0][2] = cube[2][0][2], cube[2][0][1], cube[2][0][0]
        cube[2][0][2], cube[2][0][1], cube[2][0][0] = cube[5][0][0], cube[5][1][0], cube[5][2][0]
        cube[5][0][0], cube[5][1][0], cube[5][2][0] = tmp1, tmp2, tmp3
        # 앞면을 시계방향으로 회전
        turn_face(1, 1)
    elif direction == -1:
        # 반시계 방향
        tmp1, tmp2, tmp3 = cube[0][2][0], cube[0][2][1], cube[0][2][2]
        cube[0][2][0], cube[0][2][1], cube[0][2][2] = cube[5][0][0], cube[5][1][0], cube[5][2][0]
        cube[5][0][0], cube[5][1][0], cube[5][2][0] = cube[2][0][2], cube[2][0][1], cube[2][0][0]
        cube[2][0][2], cube[2][0][1], cube[2][0][0] = cube[4][2][2], cube[4][1][2], cube[4][0][2]
        cube[4][2][2], cube[4][1][2], cube[4][0][2] = tmp1, tmp2, tmp3
        turn_face(1, -1)


def move_up():
    # 큐브 전체를 앞면을 기준으로 위쪽으로 회전
    tmp_face = cube[0]
    cube[0] = cube[1]
    cube[1] = cube[2]
    cube[2] = cube[3]
    cube[3] = tmp_face
    turn_face(4, -1)
    turn_face(5, 1)


def move_down():
    # 큐브 전체를 앞면을 기준으로 아래쪽으로 회전
    tmp_face = cube[0]
    cube[0] = cube[3]
    cube[3] = cube[2]
    cube[2] = cube[1]
    cube[1] = tmp_face
    turn_face(4, 1)
    turn_face(5, -1)


def move_right():
    # 큐브 전체를 앞면을 기준으로 오른쪽으로 회전
    tmp_face = cube[5]
    cube[5] = cube[1]
    cube[1] = cube[4]
    cube[4] = cube[3]
    turn_face(4, 1)
    turn_face(4, 1)
    cube[3] = tmp_face
    turn_face(3, 1)
    turn_face(3, 1)
    turn_face(0, -1)
    turn_face(2, 1)


def move_left():
    # 큐브 전체를 앞면을 기준으로 왼쪽으로 회전
    tmp_face = cube[4]
    cube[4] = cube[1]
    cube[1] = cube[5]
    cube[5] = cube[3]
    turn_face(5, 1)
    turn_face(5, 1)
    cube[3] = tmp_face
    turn_face(3, 1)
    turn_face(3, 1)
    turn_face(0, 1)
    turn_face(2, -1)


def cubing(face, direction):
    # 큐브 자체를 돌려 큐빙해야 하는 면을 앞면으로 이동시킨 후 앞면을 큐빙하는 함수 실행
    # 시계 반시계 방향을 1, -1로 변환
    if direction == "+":
        d = 1
    elif direction == "-":
        d = -1
    if face == "F":
        # 앞면 회전
        turn_cube(d)
    elif face == "B":
        # 뒷면 회전, 큐브 전체를 위로 회전시키고, 앞면을 큐빙해준 후, 다시 제자리로 이동
        move_up()
        move_up()
        turn_cube(d)
        move_down()
        move_down()
    elif face == "U":
        # 윗면 회전, 큐브 전체를 아래로 회전시키고, 앞면을 큐빙해준 후, 다시 제자리로 이동, 이하 생략
        move_down()
        turn_cube(d)
        move_up()
    elif face == "D":
        move_up()
        turn_cube(d)
        move_down()
    elif face == "L":
        move_right()
        turn_cube(d)
        move_left()
    elif face == "R":
        move_left()
        turn_cube(d)
        move_right()


T = int(input())
for _ in range(T):
    # 0:윗면, 1:앞면, 2:아랫면, 3:밑면, 4:왼쪽면, 5:오른쪽면
    color = ["w", "r", "y", "o", "g", "b"]
    cube = []
    for i in range(6):
        tmp = [[color[i]] * 3 for _ in range(3)]
        cube.append(tmp)
    N = int(input())
    tmp = list(map(str, input().split()))
    for i in range(N):
        now = tmp[i]
        cubing(now[0], now[1])
    for line in cube[0]:
        for value in line:
            print(value, end="")
        print()

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기