풀이
이 문제의 구현사항은 크게 두가지다.
-
회전시킬 톱니바퀴의 좌측과 우측에 배치된 톱니바퀴의 회전유무 판단.
-
회전방향에 따른 톱니상태 업데이트.
회전시킬 톱니와 방향이 주어졌을때, 우선적으로 양 옆에 있는 톱니바퀴들이 영향을 받는지 알아봐야한다.
좌측과 우측을 나누어 맞물리는 톱니가 서로 영향을 준다면 그 톱니바퀴 역시 회전한다는 정보를 저장한다.
회전할 톱니바퀴와 그 방향의 정보를 모두 종합한 후 회전방향에 따라 톱니바퀴들을 회전시키면된다.
이후 출력조건에 맞게 정답을 계산하여 출력해주면된다.
소스코드
import sys
input = sys.stdin.readline
def rotate(gn, r):
gn -= 1
rotation = [0 for _ in range(4)]
direction = [0 for _ in range(4)]
rotation[gn] = 1
direction[gn] = r
# 기준 톱니바퀴로부터 우측
for i in range(gn, 3):
if gears[i][2] != gears[i + 1][6]:
rotation[i + 1] = 1
direction[i + 1] = -direction[i]
else:
break
# 기준 톱니바퀴로부터 좌측
for i in range(gn, 0, -1):
if gears[i][6] != gears[i - 1][2]:
rotation[i - 1] = 1
direction[i - 1] = -direction[i]
else:
break
# 회전방향에 따라 톱니바퀴 회전
for i in range(4):
if rotation[i] == 1:
if direction[i] == 1:
g = gears[i].pop()
gears[i].insert(0, g)
else:
g = gears[i].pop(0)
gears[i].append(g)
gears = [[int(i) for i in input().rstrip()] for _ in range(4)]
K = int(input())
for _ in range(K):
gn, r = map(int, input().split())
rotate(gn, r)
ans = 0
for i in range(4):
if gears[i][0] == 1:
ans += 2**i
print(ans)