Posts [baekjoon] 5373. 큐빙 (python)
Post
Cancel

[baekjoon] 5373. 큐빙 (python)

5373. 큐빙 문제 바로가기

해결 방법

※ Tip! 문제에 대한 추가적인 설명

문제에 제시된 예제 입력 1을 보면 다음과 같다.

1
2
3
4
5
6
7
8
9
4
1
L-
2
F+ B+
4
U- D- L+ R+
10
L- U- L+ U- L- U- U- L+ U+ U+
  • 4라는 테스트 케이스 개수가 주어진다.
    • 4번의 각각 테스트케이스에 대한 실행을 끝낸 큐브 앞면의 결과를 출력해야 한다. → 4번의 큐브의 앞면을 출력 필요!
    • 4번의 테스트케이스 실행마다 처음에 큐브는 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색의 초기 조건에서 실행된다!
  • 큐브를 돌릴 때 해당 면을 보는 바라봤을 를 기준으로 그 면만을! 시계 방향 또는 반시계 방향으로 90도 회전한다.

1. cube 리스트에 큐브에 대한 면과 그 면에 대한 색을 저장한다.

큐빙 설명 그림1 큐빙 설명 그림2 큐빙 설명 그림3

2. 큐브를 회전시킨다.

  1. 회전이 필요한 해당 면을 시계 또는 반시계 방향으로 회전시킨다.

    rotateCenter 함수를 통해 구현하였다.

  2. 면을 회전하면서 영향을 받는 주변 면을 돌린다.

    rotateSide 함수를 통해 구현하였다.

    • rotateSide 함수의 변수 설명
      • side_change_list : 면을 돌리면서 돌아가야하는 면들의 인덱스를 저장한 이중리스트
      • side_index: side_change_list 면에 따른 값이 바뀌어야 하는 인덱스를 저장한 리스트
    1. side_change_list 를 통해 회전하고자 바라보고 있는 면(center)에 움직이는 면의 인덱스를 side_list에 저장한다. → 반시계일 경우 순서를 거꾸로 해준다.

    2. 움직이는 면에 대응하여 저장된 인덱스를 for문을 통해 값을 바꿔준다.

      첫번째 값은 temp에 저장하고 for문을 통해 3개의 면에 값을 저장시킨다. 마지막 면은 temp의 값을 통해 갱신한다.

구현한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
def rotateCenter(c, dir): # 해당 면 돌리기
    if dir == 1: # 시계방향
        cube[c][0], cube[c][1], cube[c][2], cube[c][3], cube[c][4], cube[c][5], cube[c][6], cube[c][7], cube[c][8] = cube[c][6], cube[c][3], cube[c][0], cube[c][7], cube[c][4], cube[c][1], cube[c][8], cube[c][5], cube[c][2]
    else: # 반시계방향
        cube[c][0], cube[c][1], cube[c][2], cube[c][3], cube[c][4], cube[c][5], cube[c][6], cube[c][7], cube[c][8] = cube[c][2], cube[c][5], cube[c][8], cube[c][1], cube[c][4], cube[c][7], cube[c][0], cube[c][3], cube[c][6]

        
def rotateSide(center, dir): # 주변에 있는 면 돌리기
    # side_change_list: 면을 돌리면서 돌아가야하는 면들의 인덱스를 저장한 이중리스트
    side_change_list = [
        [5, 3, 4, 2], # U면이 움직이면 돌아가야하는 주변 면의 인덱스
        [2, 4, 3, 5], # D면이 움직이면 돌아가야하는 주변 면의 인덱스
        [4, 1, 5, 0], # F면이 움직이면 돌아가야하는 주변 면의 인덱스
        [5, 1, 4, 0], # B면이 움직이면 돌아가야하는 주변 면의 인덱스
        [3, 1, 2, 0], # L면이 움직이면 돌아가야하는 주변 면의 인덱스
        [2, 1, 3, 0] # R면이 움직이면 돌아가야하는 주변 면의 인덱스
    ]

    side_list = side_change_list[center] # 변화가 필요한 면에 대한 인덱스를 저장한 리스트
    if dir == -1: # 반시계 방향일 경우 순서 거꾸로 해주기
        side_list = side_list[::-1]

    # side_index: side_change_list 면에 따른 값이 바뀌어야 하는 인덱스를 저장한 리스트
    side_index = [
        [0, 1, 2], # U 주변 면에서 변화해야할 인덱스를 저장한 리스트
        [6, 7, 8], # D 주변 면에서 변화해야할 인덱스를 저장한 리스트
        [[2, 5, 8], [0, 1, 2], [6, 3, 0], [8, 7, 6]], # F 주변 면에서 변화해야할 인덱스를 저장한 리스트
        [[2, 5, 8], [8, 7, 6], [6, 3, 0], [0, 1, 2]], # B 주변 면에서 변화해야할 인덱스를 저장한 리스트
        [[8, 5, 2], [0, 3, 6], [0, 3, 6], [0, 3, 6]], # L 주변 면에서 변화해야할 인덱스를 저장한 리스트
        [[2, 5, 8], [2, 5, 8], [6, 3, 0], [2, 5, 8]], # R 주변 면에서 변화해야할 인덱스를 저장한 리스트
    ]

    if center in [0, 1]: # U, D 돌린 경우
        # 큐브를 돌리면서 변화해야할 인덱스 바꾸기
        # 이때 temp에 처음 면의 값을 저장해 놓고 이후 마지막 면에 temp 저장하기
        temp = [cube[side_list[0]][side_index[center][0]],
                cube[side_list[0]][side_index[center][1]],
                cube[side_list[0]][side_index[center][2]]]
        for i in range(3):
            cube[side_list[i]][side_index[center][0]], cube[side_list[i]][side_index[center][1]], cube[side_list[i]][side_index[center][2]] = cube[side_list[i + 1]][side_index[center][0]], cube[side_list[i + 1]][side_index[center][1]], cube[side_list[i + 1]][side_index[center][2]]
        cube[side_list[3]][side_index[center][0]], cube[side_list[3]][side_index[center][1]], cube[side_list[3]][side_index[center][2]] = temp[0], temp[1], temp[2]

    else: # F, B, L, R 돌린 경우
        if dir == -1: # 반시계 일 경우 순서 거꾸로 해주기
            side_index[center] = side_index[center][::-1]

        # 큐브를 돌리면서 변화해야할 인덱스 바꾸기
        # 이때 temp에 처음 면의 값을 저장해 놓고 이후 마지막 면에 temp 저장하기
        temp = [cube[side_list[0]][side_index[center][0][0]],
                cube[side_list[0]][side_index[center][0][1]],
                cube[side_list[0]][side_index[center][0][2]]]
        for i in range(3):
            cube[side_list[i]][side_index[center][i][0]], cube[side_list[i]][side_index[center][i][1]], cube[side_list[i]][side_index[center][i][2]] = cube[side_list[i + 1]][side_index[center][i + 1][0]], cube[side_list[i + 1]][side_index[center][i + 1][1]], cube[side_list[i + 1]][side_index[center][i + 1][2]]
        cube[side_list[3]][side_index[center][3][0]], cube[side_list[3]][side_index[center][3][1]], cube[side_list[3]][side_index[center][3][2]] = temp[0], temp[1], temp[2]


test_case = int(input())
for _ in range(test_case):
    cube = [
        ["w"] * 9,  # cube[0]: U 윗면 저장
        ["y"] * 9,  # cube[1]: D 아랫면 저장
        ["r"] * 9,  # cube[2]: F 앞면 저장
        ["o"] * 9,  # cube[3]: B 뒷면 저장
        ["g"] * 9,  # cube[4]: L 왼쪽면 저장
        ["b"] * 9,  # cube[5]: R 오른쪽면 저장
    ]
    cube_center = ["U", "D", "F", "B", "L", "R"] # 입력된 면의 인덱스를 찾기 위한 리스트
    N = int(input())
    change_list = list(map(str, input().split()))
    for n in range(N):
        center, dir = cube_center.index(change_list[n][0]), change_list[n][1]
        if dir == "+": # 시계 방향
            dir = 1
        else: # 반시계 방향
            dir = -1
        # 큐비 돌리기
        rotateCenter(center, dir) # 1. 면 돌리기
        rotateSide(center, dir) # 2. 주변에 있는 면 돌리기

    # 윗면 출력하기
    for u in range(0, 9, 3):
        for u2 in range(3):
            print(cube[0][u + u2], end="")
        print()

유용한 반례 모음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
2
3
U+ U+ F+
3
U+ U+ F-

정답 
www
www
ggb
www
www
gbb


1
2
F+ U+

정답
gww
gww
gww


1
3
L+ U+ B+

정답
ybb
www
www


1
4
D- L+ U- L-

정답
rww
www
woo


1
5
U- D+ R+ U+ R-

정답 
www
www
gro


2
4
F+ F+ F- F-
1
D-

정답
www
www
www
www
www
www


1
16
U+ R+ R+ F+ F+ R+ R+ U+ F+ F+ R+ R+ F+ F+ U- L+

정답
oyw
oww
byw


1
8
U+ B- R- F- D+ L- B+ U-

정답
rgo
bwo
wby


1
5
L- F+ L+ D+ B+

정답
bbr
www
wgg


1
4
U+ D+ F- F-

정답
www
www
yyy
This post is licensed under CC BY 4.0 by the author.

[baekjoon] 14890. 경사로 (python)

[programmers] SQL 고득점 Kit - GROUP BY 문제 답모음 (MySQL)

Comments powered by Disqus.