[코딩테스트] 큐
reference : 2021 코딩테스트 기초(최백준) 강의를 공부하며 정리한 내용입니다.
큐(Queue)
- 순서가 있는 자료구조, 한쪽의 끝에서만 넣을 수 있고(push) 다른 한쪽 끝에서만 뺄 수 있음(pop)
-
먼저 넣은 게 가장 먼저 나오기 때문에 First In First Out(FIFO)라고 함
push : 큐에 자료를 넣는 연산
pop : 큐에서 자료를 빼는 연산
front : 큐의 가장 앞에 있는 자료를 보는 연산
back : 큐의 가장 뒤에 있는 자료를 보는 연산
empty : 큐가 비어있는지 아닌지를 알아보는 연산
size : 큐에 저장되어 있는 자료의 개수를 알아보는 연산 - Java의 경우 java.util.Quene
- 각 연산을 복잡도 O(1)만에 구현해야 한다.
- 배열
- 링크드 리스트
- 일차원 배열 하나로 구현 가능, begin / end 변수를 사용해서. begin - (end-1)까지가 큐에 들어있는 자료임.
package practice;
import java.util.Scanner;
public class Main {
static int[] queue;
static int begin;
static int end;
public static void main(String[] args) {
queue = new int[10000];
begin = 0;
end = 0;
}
public void push(int data) {
queue[end] = data;
end += 1;
}
public void pop(int data) {
queue[begin] = 0;
begin += 1;
}
public boolean empty() {
if (begin==end) return true;
else return false;
}
public int size() {
return end-begin;
}
public int front() {
return queue[begin];
}
public int back() {
return queue[end];
}
}
- 큐 구현 문제 10845번
- pop을 한다고 실제 데이터를 지우면 안 됨. java의 경우 ArrayList로 큐를 절대 구현하면 안 된다. pop연산의 경우 0번째를 지워버리면 모든 값들이 앞으로 한 칸씩 이동함. 그럼 O(N)이 걸리게 되어서 안됨!
- 따라서 큐를 직접 구현할 땐 배열이나 링크드리스트를 이용해서 하자. 배열의 경우엔 배열 크기를 정해줘야 한다. 크기는 문제에 나와있으니 그 값을 써주면 된다.
- 문제 푸는 게 아니라 공간 효율적인 큐를 구현해야 한다면 링크드리스트로 구현. 그게 아니라면 언어에 있는걸 활용.
- 큐를 가장 많이 활용하는 알고리즘은 그래프 알고리즘 중 bfs이다.
덱(Deque)
- 양 끝에서만 자료를 넣고 양 끝에서 뺄 수 있는 자료구조
- Double-ended queue
push_front : 덱의 앞에 자료를 넣는 연산
push_back : 덱의 뒤에 자료를 빼는 연산
pop_front : 덱의 앞에서 자료를 빼는 연산
pop_back : 덱의 뒤에서 자료를 빼는 연산
front : 덱의 가장 앞에 있는 자료를 보는 연산
back : 덱의 가장 뒤에 있는 자료를 보는 연산 - Java ArrayDeque 라이브러리
- 10866번 (https://www.acmicpc.net/problem/10866) -> 강의에선 라이브러리를 활용해서 풀었는데 직접 구현해보고 코드를 업데이트 할 예정임
댓글남기기