반응형
1. Queue 개념
■ 선입선출 (FIFO): 큐에서 데이터는 먼저 들어온 순서대로 출력된다.
■ enqueue: 큐에 데이터를 삽입하는 작업
■ dequeue: 큐에서 데이터를 제거하는 작업
■ Front: 큐의 앞쪽 (데이터가 제거되는 곳)
■ Rear[또는 Tail]: 큐의 뒤쪽 (새로운 데이터가 추가되는 곳)
2. 핵심요약
■ BFS (너비 우선 탐색, Breadth-First Search) 알고리즘에서는 Queue 자료구조가 필수적으로 활용된다.
■ BFS는 그래프나 트리에서 시작 노드에서부터 인접한 노드들을 차례대로 방문하여 탐색을 진행한다.
■ 이때 선입선출(FIFO) 방식이 BFS 탐색의 특성과 잘 맞아떨어지기 때문에 Queue 자료구조를 사용한다.
3. JavaScript 코딩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
// Queue 클래스를 정의
class Queue {
// 생성자: Queue 클래스 인스턴스를 생성할 때 실행됨
constructor() {
this.items = {}; // 데이터를 저장할 객체, index를 키로 사용하여 값들을 저장
this.headIndex = 0; // 큐의 앞부분을 나타내는 인덱스
this.tailIndex = 0; // 큐의 뒷부분을 나타내는 인덱스
}
// 큐에 아이템을 추가하는 메소드
enqueue(item) {
this.items[this.tailIndex] = item; // tailIndex 위치에 item을 추가
this.tailIndex++; // tailIndex를 증가시켜 큐의 끝을 업데이트
}
// 큐에서 아이템을 제거하는 메소드
dequeue() {
const item = this.items[this.headIndex]; // headIndex 위치에서 아이템을 가져옴
delete this.items[this.headIndex]; // 해당 위치의 아이템을 삭제하여 메모리에서 제거
this.headIndex++; // headIndex를 증가시켜 큐의 앞부분을 업데이트
return item; // 제거된 아이템을 반환
}
// 큐의 앞부분에 있는 아이템을 반환하는 메소드 (삭제하지 않음)
peek() {
return this.items[this.headIndex]; // headIndex 위치의 아이템을 반환
}
// 큐에 있는 아이템의 개수를 반환하는 메소드
getLength() {
return this.tailIndex - this.headIndex; // 큐에 남아있는 아이템의 개수를 계산
}
}
// Queue 클래스를 외부 모듈로 내보내기
module.exports = Queue;
// 큐 인스턴스를 생성
let queue = new Queue();
queue.enqueue(5); // 큐: 5
queue.enqueue(3); // 큐: 5, 3
queue.dequeue(); // 큐: 3
queue.enqueue(4); // 큐: 3, 4
queue.enqueue(1); // 큐: 3, 4, 1
queue.dequeue(); // 큐: 4, 1
queue.enqueue(7); // 큐: 4, 1, 7
queue.enqueue(6); // 큐: 4, 1, 7, 6
queue.dequeue(); // 큐: 1, 7, 6
// 큐가 비어있지 않으면 계속해서 dequeue를 통해 큐의 모든 아이템을 출력
while (queue.getLength() > 0) {
console.log(queue.dequeue()); // 큐의 앞부분 아이템을 출력 후 제거
}
|
cs |
4. 파이썬 코딩
■ Python에서는 collections.deque를 사용하여 큐 자료구조를 구현할 수 있다.
■ deque는 **덱(Deque, Double-ended Queue)**을 구현한 자료구조로, 큐와 스택 모두에 효율적으로 사용할 수 있다.
■ deque는 큐의 앞과 뒤에서 삽입과 삭제가 모두 효율적이기 때문에 큐 구현에 매우 적합하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
from collections import deque
class Queue:
def __init__(self):
self.items = deque()
def enqueue(self, item):
self.items.append(item) # 큐에 아이템 추가 (뒤에 추가)
def dequeue(self):
if self.get_length() > 0:
return self.items.popleft() # 큐에서 아이템 제거 (앞에서 제거)
return None # 큐가 비었을 경우 None 반환
def peek(self):
if self.get_length() > 0:
return self.items[0] # 큐의 첫 번째 아이템 확인 (삭제하지 않음)
return None
def get_length(self):
return len(self.items) # 큐의 크기 반환
# Test
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.dequeue()
queue.enqueue(4)
queue.enqueue(5)
queue.enqueue(6)
queue.dequeue()
while queue.get_length() > 0:
print(queue.dequeue())
|
cs |
반응형
'알고리즘(코딩테스트)' 카테고리의 다른 글
[DFS] 조합(combination) (0) | 2025.02.16 |
---|---|
[BFS] 개념(Breadth First Search; 너비 우선 탐색) - 자바스크립트 (0) | 2025.02.16 |
[DFS] 순열(permutation) (0) | 2025.02.16 |
[백준][DFS][난이도:하] 단지번호 붙이기 (2667번) (0) | 2025.02.16 |
[백준][DFS][난이도:하] 차이를 최대로 (10819번) (0) | 2025.02.16 |