import sys
from collections import deque
input = sys.stdin.readline
def turn(cnt, dir): # cnt : 톱니바퀴 번호, 방향(1: 시계, False:반시계)
global ctop
# 톱니바퀴 회전
if dir :
ctop[cnt] += 7
ctop[cnt] %= 8
else:
ctop[cnt] += 1
ctop[cnt] %= 8
def getScore():
return int(tob[0][ctop[0]]) * 1 + int(tob[1][ctop[1]]) * 2 + int(tob[2][ctop[2]]) * 4 + int(tob[3][ctop[3]]) * 8
tob = []
ctop = [0,0,0,0] # 현재 12시 방향에 위치한 톱니바퀴
for _ in range(4):
tob.append(list(input().strip()))
k = int(input())
for _ in range(k):
cnt, dir = list(map(int, input().split()))
dir = True if dir == 1 else False
cnt -=1
# 오른쪽 톱니바퀴 회전
nxt = cnt
while nxt < 3 and tob[nxt][(ctop[nxt] + 2)%8] != tob[nxt+1][(ctop[nxt+1]+6)%8]:
nxt += 1
ndir = dir
for i in range(cnt + 1, nxt + 1):
ndir = not ndir
turn(i, ndir)
# 왼쪽 톱니바퀴 회전
nxt = cnt
while nxt > 0 and tob[nxt-1][(ctop[nxt-1] + 2)%8] != tob[nxt][(ctop[nxt] + 6)%8]:
nxt -=1
ndir = dir
for i in range(cnt - 1, nxt - 1, -1):
ndir = not ndir
turn(i, ndir)
turn(cnt, dir)
print(getScore())
문제에서 헷갈렷던 점은, 톱니바퀴를 회전하기 전의 톱니바퀴를 비교하여 회전할 지 여부를 결정해야한다는 것.
# 오른쪽 톱니바퀴 회전
nxt = cnt
while nxt < 3 and tob[nxt][(ctop[nxt] + 2)%8] != tob[nxt+1][(ctop[nxt+1]+6)%8]:
nxt += 1
ndir = dir
for i in range(cnt + 1, nxt + 1):
ndir = not ndir
turn(i, ndir)
# 왼쪽 톱니바퀴 회전
nxt = cnt
while nxt > 0 and tob[nxt-1][(ctop[nxt-1] + 2)%8] != tob[nxt][(ctop[nxt] + 6)%8]:
nxt -=1
ndir = dir
for i in range(cnt - 1, nxt - 1, -1):
ndir = not ndir
turn(i, ndir)
turn(cnt, dir)
오른쪽과 왼쪽 각각 회전 가능한 index 까지 nxt
를 증가/감소 시킨 후 해당 톱니바퀴들을 회전시켜줬다.
양쪽 톱니바퀴를 모두 회전한 후에 해당 톱니바퀴를 회전시킨다.