Python/백준

14891_톱니바퀴

728x90

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

 

 

결국 중요한건 1~4번째까지의 수레를 돌리느냐 안돌리냐를 결정해주면 된다.

 

그래서 0으로 구성된 visited배열을 [0,0,0,0] 으로 잡은 후에 한 프로세스를 거치고 [0,0,1,-1]와 같은 배열을 얻을 수 있다면 단순히 이 배열을 순회하면서 회전만 시키면 된다고 생각했다.

 

즉, 회전과 검사를동시에 하지말고 2단계에 나눠서 한다고 생각하면 된다.

여러 방법이 있겠지만 회전을 시작하는 톱니바퀴에서 재귀함수를 이용해서 퍼져나가면서 검사를 하도록 했다. 

 

import sys
from collections import deque
input = sys.stdin.readline

gear = [0]+[ deque([ int(x) for x in input().strip() ]) for _ in range(4)]
k = int(input())
orders = [ list(map(int,input().split())) for _ in range(k)]


def rotate(num,order):
    if order:
        if order == 1:
            gear[num].appendleft(gear[num].pop())
        else:
            gear[num].append(gear[num].popleft())

def process(order):
    num,odr = order
    visited[num] = odr
    if 1<=num-1<5 and not visited[num-1] and gear[num-1][2] != gear[num][6]:
        process([num-1,odr*(-1)])
    if 1<=num+1<5 and not visited[num+1] and gear[num+1][6] != gear[num][2]:
        process([num+1,odr*(-1)])

for order in orders:
    visited = [0] * 5
    process(order)
    for i in range(1,5):
        rotate(i,visited[i])

result = 0
for i in range(1,5):
    if gear[i][0]:
        result += 2**(i-1)
print(result)
728x90

'Python > 백준' 카테고리의 다른 글

15684_사다리조작  (0) 2022.07.02
15683_감시  (0) 2022.06.30
14890_경사로  (0) 2022.06.27
14503_로봇청소기  (0) 2022.06.27
14502_연구소  (0) 2022.06.26