🥅목표
큐(Queue)의 기본 연산을 이해한다.Kotlin과 Python으로 Queue를 구현할 수 있다.
📖개념
컴퓨터의 기본적인 자료구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식이다.
🧮연산
큐(Queue)는 FIFO(First-In-First-Out)을 따른다.
add(item)
: item을 리스트의 끝부분에 추가한다.
remove()
: 리스트의 첫 번째 항목을 제거한다.
peek()
: 큐에서 가장 위에 있는 항목을 반환한다.
isEmpty()
: 큐가 비어있을 때에 true를 반환한다.
⚒️구현
Kotlin으로 구현한 큐 예시 코드는 아래와 같다.
class Queue<T> {
private val items = mutableListOf<T>()
fun add(item: T) = items.add(item)
fun remove() = items.removeAt(0)
fun peek() = items[0]
fun isEmpty() = items.isEmpty()
}
위 코드에서는 제네릭(<T>)을 이용하여 다양한 타입의 데이터를 저장할 수 있다.
큐의 기본 연산인 add
, remove
, peek
, isEmpty
이 구현되어 있으며, 각각 큐에 아이템을 추가하고, 첫 번째 아이템을 제거하며 반환하고, 첫 번째 아이템을 반환하며, 큐가 비어있는지 확인한다.
이 코드를 사용하여 큐를 만들 때, 우선 Queue 클래스의 객체를 만든다.
val myQueue = Queue<String>()
위 코드에서는 큐 내부에서 사용할 데이터의 타입을 String으로 사용하도록 선언했다(다른 타입을 사용하고자 할 경우, 이를 해당 타입으로 수정하면 됩니다.)
이제, 큐에 데이터를 추가(add)하고, 데이터를 제거(remove)하고, 큐가 비어있는지 확인(isEmpty)하는 등의 기본적인 연산을 수행할 수 있습니다.
myQueue.add("Hello, World!")
myQueue.add("안녕하세요!")
println(myQueue.peek()) // Hello, World!
myQueue.remove()
println(myQueue.peek()) // 안녕하세요!
println(myQueue.isEmpty()) // false
위 코드에서는 먼저 "Hello, World!"와 "안녕하세요!"라는 두 데이터를 큐에 추가한다.
그 다음, 큐에서 가장 먼저 들어간 데이터를 반환하는 peek()
함수를 호출하여 "Hello, World!"를 출력한다. 이후, remove() 함수를 호출하여 큐에서 첫 번째 데이터인 "Hello, World!"를 제거한다. peek() 함수를 한 번 더 호출하여 큐의 첫 번째 데이터가 "안녕하세요!"로 변경되었음을 확인한다. 마지막으로, isEmpty() 함수를 호출하여 큐가 비어있지 않음을 확인한다.
Python으로 구현한 큐
Python queue는 collection 라이브러리를 import하고, deque를 사용하는 것을 추천한다.
from collections import deque
q = deque()
q.append("Hello, World!")
q.append("안녕하세요!")
print(q[0]) // Hello, World!
q.popleft()
print(q[0]) // 안녕하세요!
if len(q) >0:
print("queue is not Empty") // queue is not Empty
🔡사용사례
데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용한다.
- 너비 우선 탐색(BFS == Breadth Frist Search) 구
- 처리해야 할 노드의 리스트를 저장하는 용도로 큐를 사용한다.
- 노드를 하나 처리할 때마다 해당 노드와 인접한 노드들을 큐에 다시 저장한다.
- 노드를 접근한 순서대로 처리할 수 있다.
- 노드
- 캐시(Cache)구현
- 우선순위가 같은 작업 예약(ex - 인쇄 대기열)
- 선입선출이 필요한 대기열(ex - 티켓 카운터)
- 콜센터 고객 대기시간
- 시스템 메시기 처리
- 프로세스 관리
Uploaded by N2T
'CS > Algorithm' 카테고리의 다른 글
유클리드 호제법(Euclidean algorithm) (2) | 2023.10.14 |
---|---|
N진법 (1) | 2023.10.04 |
힙(Heap) (0) | 2023.03.01 |
스택(Stack) (0) | 2023.02.27 |
시간 복잡도와 공간 복잡도 (0) | 2022.12.31 |