큐
: 자료구조 중 하나로, 먼저 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조이다.
- 큐는 한쪽 끝에서는 삽입 연산만 이루어지며 다른 한쪽 끝에서는 삭제 연산만 이루어지는 유한 순서 리스트이다.
- 구조상으로 큐가 스택과 다른 점은 스택에서는 삽입과 삭제가 같은 쪽에서 일어나지만 큐에서는 다른 쪽에서 일어난다.
큐의 연산
큐의 포인터
- front: 큐의 첫 번째 원소를 가리키는 포인터
- rear: 큐의 마지막 원소를 가리키는 포인터
- push(): 큐에 값을 넣는 연산 (Enqueue)
rear 위치에 자료를 추가하고 rear를 1 증가시킴
- pop(): 큐에서 자료를 빼는 연산 (Dequeue)
front 위치에 자료를 제거하고 front를 1 증가시킴
- front(): 큐의 가장 앞에 있는 자료를 반환하는 연산
- back(): 큐의 가장 뒤에 있는 자료를 반환하는 연산
- empty(): 비어있는지의 여부를 반환하는 연산
* rear가 가리키는 인덱스가 배열의 크기를 초과하게 되면 문제가 생기는데, 이를 해결하기 위한 것이 '원형 큐'와 '링크드 큐'이다.
대표적인 문제 및 사용
- 선입선출이 필요한 대기열 (티켓 카운터 or 게임같은 플랫폼)
- BFS(Breadth-First Search, 너비 우선 탐색) 구현
- 처리해야 할 노드의 리스트를 저장하는 용도
- 우선순위가 같은 작업 예약 (인쇄 대기열)
- 콜센터 고객 대기 시간
- 프린터의 출력처리
- 프로세스 관리(OS 관련 내용)
- 덱(dequeue)
큐의 종류
원형 큐
- 원형 큐의 경우, front나 rear가 큐의 끝에 도달하면 이를 큐의 맨 앞으로 보내 문제를 해결한다.
링크드 큐
- 연결리스트로 구현한 큐를 의미한다.
- 삽입과 삭제가 제한되지 않으며 크기의 제한이 없다.
[백준] 18258번 큐 2
문제링크 https://www.acmicpc.net/problem/18258
정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여섯 가지이다.
- push X: 정수 X를 큐에 넣는 연산이다.
- pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 큐에 들어있는 정수의 개수를 출력한다.
- empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
- front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
# 맞았습니다!!!
import sys
from collections import deque
# input = sys.stdin.readline() => 이 줄을 첨가했을 때 런타임 에러가 발생한다. 왜지?!?!?!?
n = int(input())
q = deque()
for _ in range(n):
cmd = list(map(str, sys.stdin.readline().split()))
if cmd[0]=='push':
q.append(cmd[1])
elif cmd[0]=='pop':
if q:
print(q.popleft())
else:
print("-1")
elif cmd[0]=='size':
print(len(q))
elif cmd[0]=='empty':
if len(q)==0:
print(1)
else:
print(0)
elif cmd[0]=='front':
if q:
print(q[0])
else:
print("-1")
elif cmd[0]=='back':
if q:
print(q[-1])
else:
print("-1")
collections의 deque 메서드
- append(val): deque의 제일 마지막 부분에 val 값을 추가(오른쪽 끝)
- appendleft(val): deque는 양쪽 끝에서 삽입, 삭제가 가능하기에, deque 시작 부분에 val 값 추가(왼쪽 끝)
- extend(dest): list와 마찬가지로 마지막 부분에 병합시켜준다
- extendleft(dest): 시작 부분에 병합시켜준다.
- pop(): deque 제일 마지막 부분부터 하나씩 추출 및 삭제한다.(오른쪽 끝부터)
- popleft(): deque 시작 부분부터 하나씩 추출 및 삭제한다.(왼쪽부터)
- rotate(count): count만큼 deque 값들을 회전, 음수면 왼쪽, 양수면 오른쪽으로 회전
[도움을 주신 블로그들 :) ]
'Problem Solving > Algorithm Concepts' 카테고리의 다른 글
프로그래머스 Level 1 모음 (0) | 2022.08.01 |
---|---|
[Java Algorithm] 1-4 단어 뒤집기(StringBuilder 이용법 또는 직접 뒤집기) (0) | 2022.07.27 |
[알고리즘] 스택(Stack) 정리 & 문제 풀이(Python) (0) | 2022.01.31 |
[운영체제] 메모리 구조 (재귀호출 vs 반복문) (0) | 2022.01.26 |
[알고리즘] 재귀함수(Recursive function) 정리 & 문제 풀이(Python) (0) | 2022.01.13 |