C언어 원형 큐 (Circular Queue)
코딩C언어
읽는데 6분 소요
처음 쓰여진 날: 2026-02-03
마지막 수정일: 2026-02-03
조회수: 25
요약
C언어 원형 큐의 개념, front/rear 포인터, 모듈러 연산을 이용한 순환 구조를 알아봅니다. 정보처리기사 실기에 출제된 원형 큐 문제를 풀기 위한 핵심 개념을 정리합니다.
원형 큐 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 원형 큐 | 배열의 끝과 처음이 연결된 큐 | SIZE=3이면 [0], [1], [2] 사용 |
| front | 맨 앞 데이터 위치 | 다음에 나갈 데이터 |
| rear | 다음 빈 칸 위치 | 새 데이터가 들어갈 자리 |
| 모듈러 연산 | 인덱스 순환을 위한 나머지 연산 | (rear + 1) % 3 |
원형 큐란?
원형 큐 개념을 몰라도 문제는 풀 수 있습니다
실기 문제를 풀기 위해 원형 큐를 깊이 이해할 필요는 없습니다. typedef, 포인터와 주소, 나머지 연산자(%)만 알면 코드를 따라가며 풀 수 있습니다. 하지만 원형 큐를 알고 있으면 훨씬 쉽게 문제를 풀 수 있으니 참고하는 걸 추천합니다.
원형 큐(Circular Queue) 는 배열의 끝과 처음을 연결하여 원형으로 동작하는 큐입니다.
선형 큐는 데이터를 삭제하면 앞쪽 공간이 비어도 재사용할 수 없습니다. 원형 큐는 이 문제를 해결합니다.

front와 rear 포인터
원형 큐는 두 개의 포인터로 데이터 위치를 관리합니다. 줄 서기로 비유하면 이해하기 쉽습니다.
| 포인터 | 역할 | 비유 |
|---|---|---|
front | 맨 앞 데이터 위치 | 다음에 서비스 받을 손님 |
rear | 다음 빈 칸 위치 | 새 손님이 줄 설 자리 |
text
코드 하이라이팅 중...
typedef를 사용하면 Queue 타입을 간결하게 정의할 수 있습니다.
c
코드 하이라이팅 중...
어떻게 원형으로 이어지나?
실제 배열은 일렬이지만, 인덱스가 끝에 도달하면 처음으로 돌아가도록 처리합니다.
text
코드 하이라이팅 중...
이 "돌아가기"를 구현하는 것이 모듈러 연산 % SIZE 입니다. 다음 섹션에서 자세히 설명합니다.

모듈러 연산 (% SIZE)
원형 큐의 핵심은 모듈러(나머지) 연산입니다. 나머지 연산자 %는 나눗셈의 나머지를 구합니다. 인덱스가 배열 끝에 도달하면 처음으로 돌아갑니다.
c
코드 하이라이팅 중...
| 현재 인덱스 | 연산 | 결과 |
|---|---|---|
| 0 | (0 + 1) % 3 | 1 |
| 1 | (1 + 1) % 3 | 2 |
| 2 | (2 + 1) % 3 | 0 (순환) |
% SIZE가 순환의 핵심입니다
모듈러 연산 덕분에 인덱스가 SIZE를 넘어가지 않고 0으로 돌아옵니다. 이것이 '원형'의 비밀입니다.
삽입 (enqueue)
데이터를 삽입하면 rear 위치에 저장하고, rear를 다음 칸으로 이동합니다.
c
코드 하이라이팅 중...

삽입 예시
c
코드 하이라이팅 중...
| 동작 | a[0] | a[1] | a[2] | front | rear |
|---|---|---|---|---|---|
| 초기 | 0 | 0 | 0 | 0 | 0 |
| enq(1) | 1 | 0 | 0 | 0 | 1 |
| enq(2) | 1 | 2 | 0 | 0 | 2 |
삭제 (dequeue)
데이터를 삭제하면 front 위치의 값을 반환하고, front를 다음 칸으로 이동합니다.
c
코드 하이라이팅 중...

삭제 예시
c
코드 하이라이팅 중...
| 동작 | 반환값 | a[0] | a[1] | a[2] | front | rear |
|---|---|---|---|---|---|---|
| 이전 | - | 1 | 2 | 0 | 0 | 2 |
| deq() | 1 | 1 | 2 | 0 | 1 | 2 |
왜 값을 실제로 지우지 않나요?
dequeue는 배열에서 값을 지우지 않고 front만 이동합니다.
| 이유 | 설명 |
|---|---|
| 효율성 | 값을 0으로 초기화하는 것도 연산입니다. 불필요한 작업은 생략합니다. |
| 덮어쓰기 | 나중에 그 자리에 enqueue하면 새 값으로 덮어씁니다. |
| 위치로 관리 | "큐에 있다/없다"는 값이 아니라 front/rear 위치로 판단합니다. |
text
코드 하이라이팅 중...
비유: 책을 버릴 때 내용을 지우지 않고, "읽을 책 목록"에서 빼는 것과 같습니다.
front == rear이면 빈 큐
front는 맨 앞 데이터 위치, rear는 다음 빈 칸 위치입니다. 둘이 같으면 뺄 데이터가 없다는 뜻입니다.

| 상태 | front | rear | 의미 |
|---|---|---|---|
| 초기 (빈 큐) | 0 | 0 | front == rear → 비어있음 |
| enqueue(10) 후 | 0 | 1 | front ≠ rear → 데이터 있음 |
| dequeue() 후 | 1 | 1 | front == rear → 다시 비어있음 |
실기 문제 풀이 전략
문제 풀이 순서
- SIZE 확인: 배열 크기가 몇인지 확인
- 초기 상태 표 작성: front, rear, 배열 상태
- 연산 순서대로 추적: enq/deq 하나씩 표에 기록
- % SIZE 계산 주의: 특히 rear가 SIZE-1일 때 다음 값 확인
문제 유형
| 유형 | 설명 |
|---|---|
| 출력값 묻기 | deq() 반환값 순서대로 출력 |
| 빈칸 채우기 | enq/deq 함수 내 % SIZE 부분 |
| 상태 추적 | 특정 연산 후 front, rear 값 |