여름의 서재
[백준] 14891_톱니바퀴 본문
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)
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 17144_미세먼지 안녕! (0) | 2021.10.20 |
---|---|
[백준] 17070_파이프 옮기기1 (DFS & DP 이용) (0) | 2021.10.13 |
[백준] 17471_게리맨더링 (0) | 2021.10.13 |
[백준] 20922_겹치는 건 싫어 (투 포인터 이용) (0) | 2021.10.08 |
[백준] 14503_로봇 청소기 (0) | 2021.10.08 |
Comments