Problem Solving/Algorithm Concepts

[알고리즘] 큐(Queue) 정리 & 문제 풀이(Python)

대범하게 2022. 2. 7. 19:22
반응형

: 자료구조 중 하나로, 먼저 넣은 데이터가 먼저 나오는 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 값들을 회전, 음수면 왼쪽, 양수면 오른쪽으로 회전

https://tooo1.tistory.com/88


 

[도움을 주신 블로그들 :) ]

https://blog.naver.com/zzaxowns/222467328858

https://galid1.tistory.com/483