재귀를 이용해서 left, right 함수를 구현해주면 된다
-> 왼쪽 끝(left 함수)을 넘거나 오른쪽 끝(right 함수)을 넘는 경우 return
-> 두 톱니바퀴가 맞닿은 부분이 같다면 return
-> 두 톱니바퀴가 맞닿은 부분이 다르다면 재귀호출 후 현재 톱니 회전
1차원 회전의 경우 deque의 rotate 메소드를 사용하면 편하다
import sys
from collections import deque
def left(index, direction):
if index < 0:
return
if Gears[index][2] == Gears[index+1][6]:
return
if Gears[index][2] != Gears[index+1][6]:
left(index-1, -direction)
Gears[index].rotate(-direction)
def right(index, direction):
if index > T-1:
return
if Gears[index][6] == Gears[index-1][2]:
return
if Gears[index][6] != Gears[index-1][2]:
right(index+1, -direction)
Gears[index].rotate(-direction)
T = int(sys.stdin.readline()[:-1])
Gears = []
for t in range(T):
Gears.append(deque(list(map(int, list(sys.stdin.readline()[:-1])))))
K = int(sys.stdin.readline()[:-1])
method = []
for k in range(K):
tmp = list(map(int, sys.stdin.readline()[:-1].split()))
method.append((tmp[0]-1, tmp[1]))
for k in range(K):
index, direction = method[k]
left(index - 1, direction)
right(index + 1, direction)
Gears[index].rotate(direction)
result = 0
for gear in Gears:
if gear[0] == 1:
result += 1
print(result)