알고리즘

[백준 알고리즘] 14891번 톱니바퀴. 파이썬(python)

삶은겨란 2022. 7. 7. 22:01
from collections import deque
gear = {}
for i in range(1, 5):
    gear[i] = deque((map(int, input())))
k=int(input())
how=[list(map(int,input().split())) for _ in range(k)]
# index2, 6 인접한 톱니

def check_left(now_gear,dir):
    # 현재 톱니가 첫번째보다 작다 or 현재톱니의 2번위치와 오른쪽 톱니의 6번위치의 값이 같다
    if now_gear<1 or gear[now_gear][2]==gear[now_gear+1][6]:
        return # 회전할 수 없으므로 종료
    check_left(now_gear-1, -dir) # 인접한 톱니의 인접한 톱니까지 확인
    gear[now_gear].rotate(dir) # 현재 톱니 회전
    
def check_right(now_gear,dir):
    # 현재 톱니가 네번째보다 크다 or 현재톱니의 6번위치와 왼쪽 톱니의 2번위치의 값이 같다
    if now_gear>4 or gear[now_gear][6]==gear[now_gear-1][2]:
        return # 회전할 수 없으므로 종료
    check_right(now_gear+1, -dir) # 인접한 톱니의 인접한 톱니까지 확인
    gear[now_gear].rotate(dir) # 현재 톱니 회전

for i in range(k):
    # 인접 톱니를 회전시킬 수 있는지 확인 후 회전
    check_left(how[i][0]-1,-how[i][1]) # (왼쪽 톱니,반대방향으로 회전)
    check_right(how[i][0]+1,-how[i][1]) # (오른쪽 톱니,반대방향으로 회전)
    gear[how[i][0]].rotate(how[i][1]) # 톱니를 회전 시킨다
    # 회전하기 전의 n,s극으로 인접 톱니의 회전 여부를 결정하기 때문에 인접 톱니를 먼저 확인하고 회전한다

result=0
for i in range(1,5):
    if gear[i][0]==0:
        result+=0
    else:
        result=result+(2**(i-1))

print(result)