Posts [알고리즘] 백준 5373 - 큐빙
Post
Cancel

[알고리즘] 백준 5373 - 큐빙


문제

5373 - 큐빙


접근

너무 끔찍한 구현문제였다…
문제보고 하기싫어서 밍기적밍기적거리다가 겨우 풀었다..

한 면을 회전시키면 해당 면은 Rotation 해준다.
해당 면과 인접한 네개의 면은 인접한 부분들만 다른 면들과 교체해준다.
나머지 한 면은 변화가 없다.

예를 들어 윗면을 돌린다고하면, 윗면은 테두리가 전체적으로 회전한다.
그리고 인접한 앞,뒤,좌,우면은 윗면과 인접한 위쪽 3개를 변경한다.
이건 알겠는데…
이걸 어떻게 코드로 구현하지..ㅎ…

우선 특정 면을 돌리겠단 명령어가 주어졌을 때, 위에서처럼 인접한 4개의 면을 어떻게 찾지..
3차원배열에 큐브박아줬는데, 규칙이 안보인다..
정반대에 있는 면을 대칭으로 해서 배열을 구성하면 옆면을 찾아올 순 있다.
문제는 옆면의 순서…

결국 면 마다 회전하는 코드 짜줌…ㅎ…
진짜 너무너무너무너무너무 토나온다.

틀렸습니다떠가지고 어디 틀렸는지만 2시간 찾았다.
결국 찾긴했는데, 배열 인덱싱 하나 실수로 안바꿔서,,,
그거 바꾸니까 통과는 했다.

정말 이렇게 풀라고 문제를 냈을까??
뭔가 쉽게하는 방법이 있을거도 같고…


코드

  • 파이썬 코드
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
import sys
#input = sys.stdin.readline
'''
0 : 위, w
1 : 아래, y
2 : 앞, r
3 : 뒤, o
4 : 왼쪽, g
5 : 오른쪽 b
'''
side_name = {'U':0, 'D':1, 'F':2, 'B':3, 'L':4, 'R':5}

cube = [[['w','w','w'],['w','w','w'],['w','w','w']],
       [['y','y','y'],['y','y','y'],['y','y','y']],
       [['r','r','r'],['r','r','r'],['r','r','r']],
       [['o','o','o'],['o','o','o'],['o','o','o']],
       [['g','g','g'],['g','g','g'],['g','g','g']],
       [['b','b','b'],['b','b','b'],['b','b','b']]]

def cubeStateChange(command, direction):
    if direction == '-':
        for _ in range(2):
            nowSideRotation(command)
            connectSideRotation(command)
    nowSideRotation(command)
    connectSideRotation(command)

def nowSideRotation(side):
    tmpCube = [[0]*3 for _ in range(3)]
    for i in range(3):
        for j in range(3):
            tmpCube[i][j] = cube[side][2 - j][i]
    cube[side] = tmpCube

def connectSideRotation(side):
    if side == 0:#위
        t1, t2, t3 = cube[2][0][0], cube[2][0][1], cube[2][0][2]
        cube[2][0][0], cube[2][0][1], cube[2][0][2] = cube[5][2][0], cube[5][1][0], cube[5][0][0]
        cube[5][2][0], cube[5][1][0], cube[5][0][0] = cube[3][2][2], cube[3][2][1], cube[3][2][0]
        cube[3][2][0], cube[3][2][1], cube[3][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] = t3, t2, t1
    elif side == 1:#아래
        t1, t2, t3 = cube[3][0][0], cube[3][0][1], cube[3][0][2]
        cube[3][0][0], cube[3][0][1], cube[3][0][2] = 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[2][2][2], cube[2][2][1], cube[2][2][0]
        cube[2][2][2], cube[2][2][1], cube[2][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] = t1, t2, t3
    elif side == 2: #앞
        t1, t2, t3 = cube[4][2][2], cube[4][2][1], cube[4][2][0]
        cube[4][2][2], cube[4][2][1], cube[4][2][0] = 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][2], cube[5][2][1], cube[5][2][0]
        cube[5][2][2], cube[5][2][1], cube[5][2][0] = cube[0][2][2], cube[0][2][1], cube[0][2][0]
        cube[0][2][2], cube[0][2][1], cube[0][2][0] = t1, t2, t3
    elif side == 3: #뒤
        t1, t2, t3 = cube[5][0][2], cube[5][0][1], cube[5][0][0]
        cube[5][0][2], cube[5][0][1], cube[5][0][0] = cube[1][2][0], cube[1][2][1], cube[1][2][2]
        cube[1][2][0], cube[1][2][1], cube[1][2][2] = cube[4][0][2], cube[4][0][1], cube[4][0][0]
        cube[4][0][2], cube[4][0][1], cube[4][0][0] = cube[0][0][2], cube[0][0][1], cube[0][0][0]
        cube[0][0][2], cube[0][0][1], cube[0][0][0] = t1, t2, t3
    elif side == 4: #왼
        t1, t2, t3 = cube[0][0][0], cube[0][1][0], cube[0][2][0]
        cube[0][0][0], cube[0][1][0], cube[0][2][0] = cube[3][0][0], cube[3][1][0], cube[3][2][0]
        cube[3][0][0], cube[3][1][0], cube[3][2][0] = cube[1][0][0], cube[1][1][0], cube[1][2][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] = t1, t2, t3
    elif side == 5: #오
        t1, t2, t3 = 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][0][2], cube[3][1][2], cube[3][2][2]
        cube[3][0][2], cube[3][1][2], cube[3][2][2] = t1, t2, t3
def initCube():
    cube = [[['w','w','w'],['w','w','w'],['w','w','w']],
           [['y','y','y'],['y','y','y'],['y','y','y']],
           [['r','r','r'],['r','r','r'],['r','r','r']],
           [['o','o','o'],['o','o','o'],['o','o','o']],
           [['g','g','g'],['g','g','g'],['g','g','g']],
           [['b','b','b'],['b','b','b'],['b','b','b']]]
    return cube
def printCube():
    cc = ['U', 'D', 'F', 'B', 'L', 'R']
    for i in range(3):
        for j in range(3):
            print(cube[0][i][j], end = '')
        print()
if __name__ == "__main__":
    t = int(input())

    for _ in range(t):
        cube = initCube()
        n = int(input())
        command = input().split()
        for c in command:
            print(c)
            cubeStateChange(side_name[c[0]], c[1])
        printCube()


This post is licensed under CC BY 4.0 by the author.

[알고리즘] 백준 17144 - 미세먼지 안녕

[알고리즘] 백준 2805 - 나무 자르기