큐(Queue)를 배우기 매우 좋은 문제다.
큐는 FIFO(First In First Out)의 형태를 가진 자료구조로, 처음 들어온 데이터가 처음으로 나간다. 이를 쉽게 이해하고 싶다면 빨대를 생각하면 된다.
빨대의 원리를 생각해보자. 우리가 빨대를 쪽 빨아대면 음료가 올라온다. 즉, 빨대랑 가장 가까운 음료부터 올라올 것이다. 이것이 바로 큐의 원리다.
문제에서는 첫 숫자가 라우터 버퍼의 최대 개수를 뜻하고, -1이 들어올 때까지 이를 이용하여 연산한다. 0이 들어오면 패킷을 처리한 것으로 처리하고, 나머지가 들어오면 버퍼에 집어넣는데, 버퍼가 가득 차면 그 숫자를 못 넣는다. 또한 문제에서 라우터의 원리를 큐에 빗대어 설명했기 때문에 라우터 버퍼는 말 그대로 큐가 된다.
이를 이용해서 풀면 크게 어려운 문제는 되지 않는다.
import sys
from collections import deque
if __name__ == '__main__':
N = int(sys.stdin.readline().rstrip())
router = deque()
while True:
now_cmd = int(sys.stdin.readline().rstrip())
if now_cmd == -1:
break
elif now_cmd == 0:
router.popleft()
else:
if len(router) != N:
router.append(now_cmd)
if router:
print(*router)
else:
print('empty')
코드에서 어려운 부분은 딱히 없다. 문제 지문에서 지시한 대로 처리하면 된다.
파이썬에서는 collection의 deque를 이용하면 쉽게 큐를 만들 수 있다. 이 deque는 데크라고 불리며, 기존의 큐에 양방향성이 추가된 것이다. 즉, 단방향성의 큐를 쓰는데에 문제가 전혀 없다.
728x90
'Python > 백준 문제 풀이' 카테고리의 다른 글
[BOJ] 7977번 크리스 마틴 (0) | 2022.11.10 |
---|---|
[BOJ] 2448번 별 찍기 - 11 (0) | 2022.10.25 |
[BOJ] 2981번 검문 (1) | 2022.10.08 |
[BOJ] 1002번 터렛 (0) | 2022.09.30 |
[BOJ] 18111번 마인크래프트 (0) | 2022.09.27 |
댓글