
전반적인 구현 흐름
- 이 문제는 회전할 톱니바퀴 기준으로 다른 어느 톱니바퀴가 회전을 할건지를 판별해야하는데 그 부분이 좀 어려웠다
 
- left(), right() 함수를 구현하여 회전할 톱니바퀴를 기준으로 왼쪽, 오른쪽을 재귀적으로 탐색하여 추가적으로 톱니바퀴를 회전시켜주었다.
 
- 추가사항) 각 회전을 수행해줄 때, 왼쪽, 오른쪽 탐색을 마친 후에 기존 gear를 회전시켜줘야함. 탐색하는 과정에서 Gears의 상태가 변하면 안됨.
 
left(gear_idx, direction)
- 처음에 회전할 톱니바퀴 기준으로 왼쪽에 있는 톱니바퀴들을 탐색함
 
- gear_idx가 0보다 작거나 맞닿은 톱니바퀴가 같은 극인 경우(Gears[gear_idx][2] == Gears[gear_idx+1][6]) return (함수 종료)
 
- 맞닿은 톱니바퀴가 다른 극인 경우 left(gear_idx - 1, -direction)함수를 재귀 호출하여 계속해서 탐색 진행 (옆으로 이동할 때마다 direction을 toggle 해줘야함)
+) 해당 gear를 회전시켜줌 
right(gear_idx, direction)
- 처음에 회전할 톱니바퀴 기준으로 왼쪽에 있는 톱니바퀴들을 탐색함
 
- gear_idx가 4 이상이거나 맞닿은 톱니바퀴가 같은 극인 경우(Gears[gear_idx][6] == Gears[gear_idx-1][2]) return (함수 종료)
 
- 맞닿은 톱니바퀴가 다른 극인 경우 right(gear_idx + 1, -direction)함수를 재귀 호출하여 계속해서 탐색 진행 (옆으로 이동할 때마다 direction을 toggle 해줘야함)
+) 해당 gear를 회전시켜줌 
import sys
from collections import deque
def left(gear_idx, direction):
	global Gears
	if gear_idx < 0:
		return
	if Gears[gear_idx][2] == Gears[gear_idx+1][6]:
		return
	
	if Gears[gear_idx][2] != Gears[gear_idx+1][6]:
		left(gear_idx-1, -direction) 
		Gears[gear_idx].rotate(direction)
def right(gear_idx, direction):
	global Gears
	if gear_idx >= 4:
		return
	if Gears[gear_idx][6] == Gears[gear_idx-1][2]:
		return
	
	if Gears[gear_idx][6] != Gears[gear_idx-1][2]:
		right(gear_idx+1, -direction) 
		Gears[gear_idx].rotate(direction)
Gears = []
for _ in range(4):
	Gears.append(deque(list(map(int, sys.stdin.readline()[:-1]))))
K = int(input())
rotation = []
for _ in range(K):
	rotation.append(list(map(int, sys.stdin.readline()[:-1].split())))
for k in range(K): 
	gear_idx = rotation[k][0] - 1
	left(gear_idx - 1, -rotation[k][1]) 
	right(gear_idx + 1, -rotation[k][1]) 
	Gears[gear_idx].rotate(rotation[k][1]) 
	
score = 0; weight = 0
for i in range(4):
	weight = 2**i
	if Gears[i][0] == 1: score += weight
print(score)