여름의 서재

[백준] 14891_톱니바퀴 본문

알고리즘/BOJ

[백준] 14891_톱니바퀴

엉아_ 2021. 10. 13. 20:48
728x90

📕 문제

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

💡 풀이법

1. 방향에 따라 리스트를 변화시켜주는 move라는 함수를 만들었다.

2. 각 톱니바퀴의 개수의 길이와 같은 must_move라는 리스트를 만들어서, 만약 해당 톱니바퀴가 움직이지 않는다면 must_move[i][0]은 0이 되고, 움직인다면 must_move[i][0]은 1이 되고, must_move[i][1]은 어느 방향으로 움직여야 하는지가 담긴다. (1, -1)

3. 처음에 움직이는 톱니바퀴가 n 이라면 n의 양쪽으로 톱니바퀴들이 움직여야하는지를 체크해준다.

4. 모두 체크가 끝나면 must_move 리스트를 순회하며 움직여야 하는 톱니바퀴라면 move함수를 각 톱니바퀴마다 적용해준다.

 

from collections import deque

def move(n, d):
    if d == -1:
        temp = gear[n].popleft()
        gear[n].append(temp)
    else:
        temp = gear[n].pop()
        gear[n].appendleft(temp)

gear = [0] + [deque(list(input())) for _ in range(4)]
N = int(input())
for _ in range(N):
    must_move = [[0, 1] for _ in range(5)]

    n, d = map(int, input().split())
    must_move[n][0], must_move[n][1] = 1, d

    for i in range(n, 1, -1):
        if gear[i][6] != gear[i-1][2]:
            if must_move[i][1] == 1:
                must_move[i-1][0], must_move[i-1][1]= 1, -1
            else:
                must_move[i-1][0], must_move[i-1][1]= 1, 1
        else:
            break
    
    for i in range(n, 4):
        if gear[i][2] != gear[i+1][6]:
            if must_move[i][1] == 1:
                must_move[i+1][0], must_move[i+1][1] = 1, -1
            else:
                must_move[i+1][0], must_move[i+1][1] = 1, 1
        else:
            break

    for i in range(1, 5):
        if must_move[i][0] == 1:
            move(i, must_move[i][1])
    
ans = 0
for i in range(1, 5):
    if gear[i][0] == '1':
        ans += 2**(i-1)
print(ans)
Comments