풀이


이 문제의 구현사항은 크게 두가지다.

  1. 회전시킬 톱니바퀴의 좌측과 우측에 배치된 톱니바퀴의 회전유무 판단.

  2. 회전방향에 따른 톱니상태 업데이트.

회전시킬 톱니와 방향이 주어졌을때, 우선적으로 양 옆에 있는 톱니바퀴들이 영향을 받는지 알아봐야한다.

좌측과 우측을 나누어 맞물리는 톱니가 서로 영향을 준다면 그 톱니바퀴 역시 회전한다는 정보를 저장한다.

회전할 톱니바퀴와 그 방향의 정보를 모두 종합한 후 회전방향에 따라 톱니바퀴들을 회전시키면된다.

이후 출력조건에 맞게 정답을 계산하여 출력해주면된다.

소스코드


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)

References