문제
https://www.acmicpc.net/problem/14891
풀이
상황 설명이 굉장히 난해하고 비직관적이므로 글을 잘 읽어야 한다. 문제를 겨우 이해하고 나면 알고리즘이나 구현 능력 자체는 크게 요구하지 않는다. 글을 이해하는것 자체가 이 문제의 가장 큰 난관이다.
이 문제에서 톱니바퀴는 현실의 톱니바퀴처럼 움직이지 않는다. 이전 톱니바퀴가 회전하면 다음 톱니바퀴도 회전해야할지 말아야 할지를 이미 돌아간 상태의 이전 톱니바퀴가 아닌 돌기 전의 이전 톱니바퀴의 상태로 판단해야 한다.
코드
class Gear():
def __init__(self, stat):
self.__stat = stat
self.__top = 0
self.__left = 6
self.__right = 2
def rotate(self, drct):
self.__top = (self.__top - drct) % 8
self.__left = (self.__left - drct) % 8
self.__right = (self.__right - drct) % 8
@property
def top(self):
return self.__stat[self.__top]
@property
def left(self):
return self.__stat[self.__left]
@property
def right(self):
return self.__stat[self.__right]
def left_shift(gear_num, drct):
new_drct = drct * -1
cur_gear = gear_num
for next_gear in range(gear_num - 1, 0, -1):
if gears[next_gear].right != gears[cur_gear].left:
rotate_queue.append((next_gear, new_drct))
cur_gear = next_gear
new_drct *= -1
else:
break
def right_shift(gear_num, drct):
new_drct = drct * -1
cur_gear = gear_num
for next_gear in range(gear_num + 1, 5):
if gears[next_gear].left != gears[cur_gear].right:
rotate_queue.append((next_gear, new_drct))
cur_gear = next_gear
new_drct *= -1
else:
break
gear1 = Gear(list(map(int, input())))
gear2 = Gear(list(map(int, input())))
gear3 = Gear(list(map(int, input())))
gear4 = Gear(list(map(int, input())))
gears = [None, gear1, gear2, gear3, gear4]
k = int(input())
answer = 0
rotate_queue = []
for _ in range(k):
num, drct = map(int, input().split())
rotate_queue.append((num, drct))
left_shift(num, drct)
right_shift(num, drct)
for g, d in rotate_queue:
gears[g].rotate(d)
rotate_queue = []
rank = 1
for idx in range(1, 5):
answer += gears[idx].top * rank
rank *= 2
print(answer)