BOJ 14891: 톱니바퀴 https://www.acmicpc.net/problem/14891
4개
밖에 없다.1이 시계방향
, -1이 반시계방향
이다deque
에 넣는다.재귀
를 통해 기준 톱니에서 가장 멀리 떨어진 회전 가능한 톱니까지 탐색하고 거기서부터 차례로 회전시켜나온다.인덱스 2
, 인덱스 6
이다.deque.rotate(양수 or 음수)
메소드를 사용한다.import sys
from collections import deque
# 기준 오른쪽을 탐색하고 회전
def check_right(start, dirs):
if start > 4 or chains[start-1][2] == chains[start][6]:
return
if chains[start-1][2] != chains[start][6]:
check_right(start+1, -dirs) # 가능한 가장 먼 곳 까지 갔다가
chains[start].rotate(dirs) # 회전시킴
# 기준 왼쪽을 탐색하고 회전
def check_left(start, dirs):
if start < 1 or chains[start][2] == chains[start+1][6]:
return
if chains[start+1][6] != chains[start][2]:
check_left(start-1, -dirs) # 가능한 가장 먼 곳 까지 갔다가
chains[start].rotate(dirs) # 회전시킴
chains = dict() # 톱니들 넣을 딕셔너리
# 입력받음
for i in range(1, 5):
chains[i] = deque(list(map(int, list(sys.stdin.readline().replace('\n', '')))))
K = int(sys.stdin.readline())
for _ in range(K):
# 톱니번호, 회전방향
num, dirs = map(int, sys.stdin.readline().split())
check_right(num+1, -dirs) # 기준 바로 오른쪽부터 시작
check_left(num-1, -dirs) # 기준 바로 왼쪽부터 시작
chains[num].rotate(dirs) # 기준 회전
result = 0
for i in range(4):
result += (2**i) * chains[i+1][0]
print(result)