본문 바로가기
Problem Solving/BOJ

[Python]16939. 2x2x2 큐브

by 부르르 2019. 4. 10.

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

 

16939번: 2×2×2 큐브

첫째 줄에 2×2×2 루빅스 큐브 각 면의 각 칸 색상이 주어진다. 색상은 1부터 6까지의 자연수로 나타내며, 각 자연수는 총 4번 등장한다. i번째 수가 의미하는 칸은 아래와 같다.

www.acmicpc.net


 

5373. 큐빙을 풀기전에 미리 풀어보면 좋은 문제이다.

여기서 pitch, yaw, roll 은 3차원 축에 대한 회전방향을 나타내는 용어이다.

손가락으로 따라해보면 이해가 잘 된다!

또한 큐브의 경우 한방향으로 3번 회전하는 것은 곳 1번  반대방향으로 회전한 것과 같다.

따라서 코드는 다음과 같다. ccw는 반시계방향, cw는 시계방향이다.

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
def pitch_ccw(size=2):
    tmp1, tmp2 = cube[22], cube[22 + size]
    cube[22], cube[22 + size] = cube[9], cube[9 + size]
    cube[9], cube[9 + size] = cube[5], cube[5 + size]
    cube[5], cube[5 + size] = cube[1], cube[1 + size]
    cube[1], cube[1 + size] = tmp1, tmp2
 
def roll_ccw(size=2):
    tmp1, tmp2 = cube[17], cube[17 + size]
    cube[17], cube[17 + size] = cube[10], cube[9]
    cube[10], cube[9= cube[16], cube[16-size]
    cube[16], cube[16 - size] = cube[3], cube[4]
    cube[3], cube[4= tmp1, tmp2
 
def yaw_ccw(size=2):
    tmp = cube[21:21 + size]
    cube[21:21 + size] = cube[17:17 + size]
    cube[17:17 + size] = cube[5:5 + size]
    cube[5:5 + size] = cube[13:13 + size]
    cube[13:13 + size] = tmp
 
def pitch_cw(size=2):
    for _ in range(3):
        pitch_ccw(size)
 
def roll_cw(size=2):
    for _ in range(3):
        roll_ccw(size)
 
def yaw_cw(size=2):
    for _ in range(3):
        yaw_ccw(size)
 
def check_all_surface():
    for i in range(6):
        for j in range(14):
            if cube[4 * i + j] != cube[4 * i + (j + 1)]:
                return False
    return True
 
CUBE = [0+ list(map(int, input().split()))
answer = 0
 
if not answer: # pitch 반시계방향
    cube = CUBE[:]
    pitch_ccw(2)
    if check_all_surface():
        answer = 1
 
if not answer: # pitch 시계방향
    cube = CUBE[:]
    pitch_cw(2)
    if check_all_surface():
        answer = 1
 
if not answer: # roll 반시계방향
    cube = CUBE[:]
    roll_ccw(2)
    if check_all_surface():
        answer = 1
 
if not answer: # roll 시계방향
    cube = CUBE[:]
    roll_cw(2)
    if check_all_surface():
        answer = 1
 
if not answer: # yaw 반시계방향
    cube = CUBE[:]
    yaw_ccw(2)
    if check_all_surface():
        answer = 1
 
if not answer: # yaw 시계방향
    cube = CUBE[:]
    yaw_cw(2)
    if check_all_surface():
        answer = 1
 
print(answer)
cs
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]16918. 봄버맨  (0) 2019.04.11
[Python]5373. 큐빙  (0) 2019.04.11
[Python]16235. 나무 재테크  (0) 2019.04.10
[Python]16236. 아기 상어  (0) 2019.04.09
[Python]6064. 카잉 달력  (0) 2019.04.09

댓글