전반적인 구현 흐름
- 이 문제는 회전할 톱니바퀴 기준으로 다른 어느 톱니바퀴가 회전을 할건지를 판별해야하는데 그 부분이 좀 어려웠다
- 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)