728x90
반응형
1. 원형 큐란?
원형 큐(Circular Queue)는 일반적인 큐(Queue)의 한계를 극복한 자료구조로,
배열을 원형 형태로 연결하여 큐의 공간을 효율적으로 활용하는 방식이다.
✅ 일반적인 큐의 문제점
- 일반적인 선형 큐(Linear Queue)는 enqueue(삽입)과 dequeue(삭제)를 반복하면 배열의 앞쪽 공간이 비어도 재사용할 수 없음
- 즉, 배열의 크기를 초과하면 사용되지 않는 공간이 발생하여 비효율적임
✅ 원형 큐의 특징
- 선형 큐의 메모리 낭비 문제를 해결
- 배열의 끝과 시작이 연결된 형태
- 배열을 넘어가면 다시 처음으로 돌아갈 수 있음 (모듈러 연산 활용)
2. 원형 큐 vs 선형 큐 비교
비교 항목선형 큐 (Linear Queue)원형 큐 (Circular Queue)
메모리 활용 | 비효율적 (삭제 후 공간 재사용 불가) | 효율적 (공간 재사용 가능) |
구현 방식 | 배열 또는 연결 리스트 | 배열 기반 (끝과 처음 연결) |
Front & Rear 이동 | 한 방향으로만 이동 | 원형으로 회전 가능 |
오버헤드 | 크기 초과 시 새로운 배열 할당 필요 | 배열 크기 내에서 회전하여 사용 |
💡 즉, 원형 큐는 선형 큐의 공간 낭비 문제를 해결한 구조다!
3. 원형 큐의 동작 방식
배열을 사용한 원형 큐의 주요 연산
- enqueue(x): 데이터 삽입 (Rear 이동)
- dequeue(): 데이터 삭제 (Front 이동)
- isEmpty(): 큐가 비었는지 확인
- isFull(): 큐가 가득 찼는지 확인
✅ 원형 큐의 핵심 로직
- enqueue(x) 삽입
- rear 위치에 데이터 추가
- rear = (rear + 1) % 배열 크기 (모듈러 연산 활용)
- dequeue() 삭제
- front 위치의 데이터를 삭제
- front = (front + 1) % 배열 크기 (모듈러 연산 활용)
- 원형 큐에서 "가득 찼는지" 확인하는 조건
- rear가 한 칸 이동하면 front와 같아질 경우, 큐가 가득 참 (Full 상태)
(rear + 1) % 배열 크기 == front
- rear가 한 칸 이동하면 front와 같아질 경우, 큐가 가득 참 (Full 상태)
🎯 원형 큐의 주요 기능
- enqueue(int value) → 원형 큐에 데이터를 삽입 (O(1))
- dequeue() → 원형 큐에서 데이터를 제거 (O(1))
- isFull() → 큐가 가득 찼는지 확인
- isEmpty() → 큐가 비었는지 확인
- peek() → 현재 front 값을 조회
- printQueue() → 큐의 현재 상태 출력
4. 원형 큐의 구현
✔ 원형 큐는 모듈러 연산(%)을 활용하여 배열의 끝에서 다시 앞으로 돌아갈 수 있도록 구현됨.
✔ 공간을 낭비하지 않고, 효율적으로 활용할 수 있음!
class CircularQueue {
private int[] queue; // 원형 큐를 저장할 배열
private int front; // 첫 번째 요소 위치
private int rear; // 마지막 요소 위치
private int size; // 큐의 최대 크기
private int count; // 현재 요소 개수
// 생성자: 원형 큐 초기화
public CircularQueue(int size) {
this.size = size;
this.queue = new int[size];
this.front = 0;
this.rear = 0;
this.count = 0;
}
// ✅ 원형 큐가 비어 있는지 확인
public boolean isEmpty() {
return count == 0;
}
// ✅ 원형 큐가 가득 찼는지 확인
public boolean isFull() {
return count == size;
}
// ✅ 원형 큐에 데이터 삽입 (enqueue)
public void enqueue(int value) {
if (isFull()) {
throw new IllegalStateException("Queue is full");
}
queue[rear] = value;
rear = (rear + 1) % size; // 원형으로 이동
count++;
}
// ✅ 원형 큐에서 데이터 제거 (dequeue)
public int dequeue() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty");
}
int removedValue = queue[front];
queue[front] = -1; // 값 제거 (옵션)
front = (front + 1) % size; // 원형으로 이동
count--;
return removedValue;
}
// ✅ 현재 front 값을 조회 (peek)
public int peek() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty");
}
return queue[front];
}
// ✅ 큐의 현재 상태 출력
public void printQueue() {
System.out.print("Queue: ");
for (int i = 0; i < size; i++) {
System.out.print(queue[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
CircularQueue cq = new CircularQueue(5);
// 데이터 삽입
cq.enqueue(1);
cq.enqueue(2);
cq.enqueue(3);
cq.printQueue(); // 1 2 3 -1 -1
// 데이터 제거
System.out.println("Dequeued: " + cq.dequeue()); // 1 제거
cq.printQueue(); // -1 2 3 -1 -1
// 추가 삽입
cq.enqueue(4);
cq.enqueue(5);
cq.enqueue(6);
cq.printQueue(); // 6이 rear로 들어가며 원형 큐 동작 확인
}
}
🔍 원형 큐의 핵심 로직
- rear = (rear + 1) % size; → 데이터를 추가할 때, rear가 배열 끝에 도달하면 다시 처음으로 이동
- front = (front + 1) % size; → 데이터를 제거할 때, front가 배열 끝에 도달하면 다시 처음으로 이동
- isFull() 조건: (rear + 1) % size == front
- isEmpty() 조건: count == 0
5. 원형 큐의 시간 복잡도
연산시간 복잡도
enqueue() | O(1) |
dequeue() | O(1) |
isEmpty() / isFull() | O(1) |
💡 모든 연산이 O(1)로 빠르게 수행됨!
💡 선형 큐보다 효율적인 메모리 사용이 가능!
6. 원형 큐의 활용 예시
✅ 운영체제(Operating System)
- CPU 스케줄링 (Round Robin 방식)
- I/O 버퍼 관리
✅ 네트워크(Computer Networks)
- 패킷 큐(Buffer Overflow 방지)
✅ 데이터 스트림 처리
- 음악/영상 플레이어의 버퍼 관리
7. 정리 및 결론
✔ 원형 큐는 선형 큐의 공간 낭비 문제를 해결한 구조
✔ 모듈러 연산을 활용해 배열의 끝에서 다시 앞으로 연결
✔ 모든 연산이 O(1)로 빠르게 수행됨
✔ 운영체제, 네트워크, 데이터 스트림 처리 등 다양한 곳에서 활용됨
💡 즉, 원형 큐는 메모리를 효율적으로 활용하면서도 빠른 성능을 제공하는 자료구조! 🚀
🎯 발표 팁
- "선형 큐의 문제점"을 강조한 후, 원형 큐가 이를 어떻게 해결하는지 설명하기
- 실제 사용 사례(CPU 스케줄링, 네트워크 패킷 처리)와 연관지어 설명하면 이해하기 쉬움
- 모듈러 연산(%)이 핵심 개념이므로, 이를 강조하여 설명하면 좋음
🔥 실제 코드 예제와 시각적 자료(배열이 순환하는 GIF 등)를 활용하면 발표가 더욱 효과적일 것! 🚀
728x90
반응형
'Develop > Coding Test | Algorithm' 카테고리의 다른 글
Tree 전위, 중위, 후위 순회 (0) | 2024.11.07 |
---|---|
알고리즘 정리 및 예제 (1) | 2024.10.22 |
기본 자료구조 및 사용법 정리 (0) | 2024.10.22 |
예상 알고리즘 문제 (0) | 2024.10.22 |
[백준] JAVA 풀이 - 2805: 나무 자르기 (0) | 2024.05.10 |
댓글