(サムスン)-ギア(14891)



https://www.acmicpc.net/problem/14891
import sys
from collections import deque

def checkRight(start, dirs):
    if (start > 4) or gears[start - 1][2] == gears[start]:
        return
    
    if gears[start - 1][2] != gears[start][6]:
        checkRight(start + 1, -dirs)
        gears[start].rotate(dirs)
        
def checkLeft(start, dirs):
    if start < 1 or gears[start][2] == gears[start + 1][6]:
        return # 가장 왼쪽 톱니 바퀴이거나 오른쪽 톱니바퀴와 맞닿는 부분의 극이 같을 때
    
    if gears[start + 1][6] != gears[start][2]:
        checkLeft(start - 1, -dirs) # 왼쪽 톱니 체크할 때 현 톱니의 반대 방향으로 회전
        gears[start].rotate(dirs) # 넘겨 받은 dirs로 rotate 메서드 회전한다.
        
gears = {}

for i in range(1, 5): # 4개 톱니바퀴 상태
    gears[i] = deque(list(map(int, list(sys.stdin.readline().replace("\n", "")))))
    # gears[i] = deque([1, 0, 1, 0, 1, 1, 1, 1]), gears[i + 1] = ...
    # gears = {i : deque([1, 0, 1, 0, 1, 1, 1, 1]), ...}
n = int(sys.stdin.readline())

for i in range(n):
    num, dirs = map(int, sys.stdin.readline().split())
    checkRight(num + 1, -dirs)
    checkLeft(num - 1, -dirs)
    gears[num].rotate(dirs)
    
result = 0
for i in range(4):
    result += (2 ** i) * gears[i + 1][0] 
    # 인덱스 0번째가 12시 방향
    # 인덱스 커질수록 1, 2, 4, 8처럼 2배 지수
print(result)
rotateメソッドの使用
参照)
キューなし直接回転:https://pacific-ocean.tistory.com/369
キュー自体による回転:https://inspirit941.tistory.com/entry/Python-白準-14891-歯車