boj

백준 14891 톱니바퀴 -python

boj-14891

Posted by 동식이 블로그 on November 12, 2019

백준 14891 톱니바퀴 -python

문제

  • 시뮬레이션 문제


문제풀이

  • 시계방향, 반시계 방향으로 돌리기
  • 기준 톱니바퀴가 회전하면 옆 톱니바퀴는 기준 톱니바퀴의 반대방향으로 회전해야 한다
    • 옆 톱니바퀴가 회전하면 이와 맞물려 있는 톱니바퀴는 또 반대방향으로 회전한다


보완

  • check 부분을 조금 더 효과적으로, rotate 부분을 더 효과적으로 짜는 방법을 연구해봐야 겠다..

code

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
# 시계방향, 반시계방향으로 돌리기
def rotate(state):
    for n, i in enumerate(state):
        if(i == 1):
            gear[n][0], gear[n][1], gear[n][2], gear[n][3], gear[n][4], gear[n][5], gear[n][6], gear[n][7] = gear[n][7], gear[n][0], gear[n][1], gear[n][2], gear[n][3], gear[n][4], gear[n][5], gear[n][6]
        elif(i == -1):
            gear[n][0], gear[n][1], gear[n][2], gear[n][3], gear[n][4], gear[n][5], gear[n][6], gear[n][7] = gear[n][1], gear[n][2], gear[n][3], gear[n][4], gear[n][5], gear[n][6], gear[n][7], gear[n][0]
    # for n, i in enumerate(state):
    #     if(i == 1):
    #         tail = gear[n].pop(7)
    #         gear[n].insert(0, tail)
    #     elif(i == -1):
    #         head = gear[n].pop(0)
    #         gear[n].insert(7, head)
# 톱니바퀴 체크
## 각 톱니바퀴 번호별로 서로 맞물려 있기 때문에 이를 고려해서 방향 체크를 해줘야 함
def check(n, d, state):
    if(n == 1):
        state[0] = d
        d = -d
        if(gear[0][2] != gear[1][6]):
            state[1] = d
            d = -d
            if(gear[1][2] != gear[2][6]):
                state[2] = d
                d = -d
                if(gear[2][2] != gear[3][6]):
                    state[3] = d
    elif(n == 2):
        state[1] = d
        t = -d
        if(gear[0][2] != gear[1][6]):
            state[0] = t
        if(gear[1][2] != gear[2][6]):
            state[2] = t
            t = -t
            if(gear[2][2] != gear[3][6]):
                state[3] = t
    elif(n == 3):
        state[2] = d
        t = -d
        if(gear[1][2] != gear[2][6]):
            state[1] = -d
            t = -t
            if(gear[0][2] != gear[1][6]):
                state[0] = t
        if(gear[2][2] != gear[3][6]):
            state[3] = -d
    elif(n == 4):
        state[3] = d
        t = -d
        if(gear[2][2] != gear[3][6]):
            state[2] = t
            t = -t
            if(gear[1][2] != gear[2][6]):
                state[1] = t
                t = -t
                if(gear[0][2] != gear[1][6]):
                    state[0] = t

gear = [list(map(int, input())) for _ in range(4)]

k = int(input())
# 몇번재 톱니바퀴가 어느 방향으로 돌아야 할지를 저장해 주기위한 리스트
state = [0,0,0,0]
for _ in range(k):
    n, d = map(int, input().split())
    check(n, d, state)
    rotate(state)
    state = [0,0,0,0]

print(gear[0][0]*1 + gear[1][0]*2 + gear[2][0]*4 + gear[3][0]*8)