응용정보기술자시험 과목A 제5회: 자료구조·탐색·정렬

응용정보기술자시험 과목 A에 필요한 배열·연결 리스트·스택·큐·트리·힙의 선택 기준, 선형 탐색과 이진 탐색의 비교 횟수, 버블·삽입·병합 정렬 추적과 복잡도·안정성을 풀이 예제와 오리지널 연습 문제 4문항으로 익힙니다.

応用情報技術者試験科目Aデータ構造探索整列

AP 과목 A 제5편 · 2026년도·실라버스 Ver.7.2 기준의 독립 학습 자료입니다. IPA와 제휴하지 않으며 합격을 보장하지 않습니다. 시리즈 허브 보기

개정일: 2026-10-20 대상 범위: 2026년 시험, IPA 응용정보기술자시험 실러버스 Ver.7.2 기준 주의: 시험 전에 반드시 IPA 공식 사이트에서 최신 실러버스와 시험 정보를 다시 확인하세요. 이 글은 학습 보조 자료이며 합격을 보장하지 않습니다. IPA가 이 글을 검토하거나 보증한 것은 아닙니다.


목차

  1. 학습 목표
  2. 용어 대조표 (한국어↔일본어↔영어)
  3. 복잡도 읽는 법과 이 글의 비용 가정
  4. 자료구조 선택 기준과 트레이드오프
  5. 탐색: 선형 탐색과 이진 탐색
  6. 정렬: 알고리즘별 특징과 비교표
  7. 예제 풀이 (4개 이상)
  8. 오리지널 연습문제 4문항
  9. 복잡도 퀵 시트
  10. 자주 하는 실수
  11. 최종 자기 점검
  12. 복습 제안 (1일/3일/7일)
  13. 실러버스 대응
  14. 출처·참고
  15. 범위 경계와 다음 회 예고

1. 학습 목표

이 회를 마치면 다음을 할 수 있어야 합니다.

  • 배열·연결 리스트·스택·큐·트리·힙의 특징을 설명하고, 주어진 상황에 맞는 구조를 근거와 함께 고를 수 있다.
  • 스택(LIFO)과 큐(FIFO)의 상태 변화를 한 단계씩 정확히 추적할 수 있다.
  • 이진 탐색의 전제 조건(정렬 + 임의 접근)을 설명하고, 정해진 규칙에 따라 비교 횟수를 셀 수 있다.
  • 주요 정렬 알고리즘의 최선/평균/최악 시간 복잡도, 보조 공간, 안정성, 제자리 여부를 조건과 함께 말할 수 있다.
  • Big-O가 “실행 시간(초)“이 아니라 “입력 크기에 대한 증가 차수”라는 점을 구분할 수 있다.

2. 용어 대조표 (한국어↔일본어↔영어)

한국어 일본어 영어
배열 配列 array
연결 리스트 連結リスト(リンク付リスト、線形リスト) linked list
노드 ノード(節、セル) node
포인터 / 링크 ポインタ / リンク pointer / link
스택 スタック stack
큐 キュー(待ち行列) queue
트리 木(木構造) tree
루트 / 리프 / 간선 根 / 葉 / 枝 root / leaf / edge
이진 탐색 트리 2分探索木 binary search tree (BST)
균형 트리 バランス木(平衡木) balanced tree
힙 ヒープ heap
선형 탐색 線形探索(法) linear search
이진 탐색 2分探索(法) binary search
정렬 整列(ソート) sorting
안정 정렬 安定なソート(安定ソート) stable sort
제자리 정렬 インプレースなソート(その場での整列) in-place sort
시간 복잡도 時間計算量 time complexity
공간 복잡도 領域計算量(空間計算量) space complexity

용어 주의: 일본어의 「内部ソート」(내부 정렬)는 “데이터를 주기억장치 안에서 정렬한다”는 뜻으로, “추가 메모리를 거의 쓰지 않는다”는 제자리(in-place) 정렬과는 다른 개념입니다.


3. 복잡도 읽는 법과 이 글의 비용 가정

3.1 Big-O는 증가 차수다

  • O(n), O(n²), O(log n) 같은 표기는 입력 크기 n이 커질 때 작업량이 어떤 차수로 늘어나는지를 나타냅니다.
  • 실행 시간(초)을 직접 뜻하지 않습니다. 같은 O(n log n)이라도 상수 계수, 메모리 접근 패턴, 하드웨어에 따라 실제 시간은 달라집니다. n이 작을 때는 O(n²) 알고리즘이 더 빠를 수도 있습니다.

3.2 최선·평균·최악과 보조 공간

  • 최선(best): 가장 유리한 입력에서의 작업량. 예: 이미 정렬된 입력에서의 삽입 정렬.
  • 평균(average): 입력 분포를 가정했을 때의 기대 작업량.
  • 최악(worst): 가장 불리한 입력에서의 작업량. “보장”을 말할 때는 최악을 봅니다.
  • 보조 공간(auxiliary space): 입력 자체를 담는 공간을 제외하고 알고리즘이 추가로 쓰는 메모리. “제자리 정렬”은 보조 공간이 O(1)(또는 그에 가까운 작은 양)인 정렬을 말합니다.

3.3 이 글의 비용 가정

  • 배열: 원소가 메모리에 연속 배치되며, 인덱스로 임의 위치에 O(1)로 접근할 수 있다고 가정합니다.
  • 연결 리스트: 각 노드가 다음(양방향이면 이전도) 노드로의 링크를 가지며, k번째 노드에 가려면 앞에서부터 링크를 따라가야 한다고 가정합니다.
  • 비교 1회, 교환 1회, 링크 1회 따라가기는 각각 상수 시간으로 봅니다.

4. 자료구조 선택 기준과 트레이드오프

4.1 배열 (配列 / array)

  • 인덱스 접근: O(1). A[i]의 주소를 바로 계산할 수 있기 때문입니다.
  • 중간 삽입·삭제: 보통 O(n). 위치 k에 넣거나 빼면 그 뒤 원소들을 한 칸씩 밀거나 당겨야(시프트) 합니다.
  • 장점: 연속 배치라 캐시 지역성이 좋아, 순차 처리가 실제로 빠른 경우가 많습니다.
  • 동적 배열의 끝 추가: 분할 상환(amortized) O(1). 용량이 차면 더 큰 영역을 확보해 전체를 복사(O(n))하므로, 매번 O(1)이 보장되는 것은 아닙니다. 많은 추가를 평균 내면 1회당 O(1)이라는 뜻입니다.
  • 실러버스 용어: 다차원 배열, 정적 배열, 동적 배열.

4.2 연결 리스트 (連結リスト / linked list)

  • 위치 접근·탐색: O(n). k번째로 가려면 머리부터 링크를 따라가야 합니다.
  • 삽입·삭제: 대상 위치(노드)와 바꿔야 할 링크를 이미 알고 있을 때만 O(1). 위치를 찾는 과정이 필요하면 그 탐색이 O(n)입니다.
    • 단방향 리스트에서 어떤 노드를 삭제하려면 그 앞 노드를 알아야 합니다. 양방향 리스트는 해당 노드만 알면 앞뒤 링크를 고쳐 O(1)에 삭제할 수 있습니다.
  • 단점: 노드마다 포인터를 저장하는 오버헤드가 있고, 노드가 흩어져 있어 캐시 지역성이 약합니다.
  • 실러버스 용어: 단방향 리스트, 양방향 리스트, 환형 리스트.

4.3 스택과 큐

스택 (スタック / stack) 큐 (キュー / queue)
원칙 LIFO (후입선출) FIFO (선입선출)
넣기 push enqueue
꺼내기 pop (가장 최근에 넣은 것) dequeue (가장 먼저 넣은 것)
쓰임 예 실행 취소(Undo) 이력, 괄호 짝 검사, 함수 호출 관리 프린터 작업 대기열, 요청 버퍼, 너비 우선 탐색(BFS)

4.4 트리, 이진 탐색 트리, 균형 트리, 힙

  • 트리: 계층 구조. 맨 위가 루트(根), 자식이 없는 노드가 리프(葉), 노드를 잇는 선이 **간선(枝)**입니다.
  • 이진 탐색 트리(BST): 각 노드에 대해 “왼쪽 부분 트리의 키 < 노드의 키 < 오른쪽 부분 트리의 키”(중복 키 처리 규칙은 구현마다 다름)라는 순서가 유지됩니다.
    • 일반 BST는 삽입 순서에 따라 한쪽으로 치우칠 수 있습니다. 예: 1, 2, 3, 4, 5 순서로 넣으면 사실상 리스트가 되어 탐색 최악 O(n).
    • 균형 BST(AVL 트리 등)는 높이를 O(log n)으로 유지하므로 탐색·삽입·삭제가 O(log n). B 트리도 균형을 유지하는 다분 탐색 트리입니다.
  • 힙: 완전 이진 트리이면서 “부모 ≥ 자식”(최대 힙) 같은 부모-자식 간 순서만 유지합니다.
    • 최대값 확인 O(1), 삽입·최대값 꺼내기 O(log n) → 우선순위 큐에 적합.
    • 전체가 정렬된 수열이 아닙니다. 형제끼리, 다른 가지끼리는 순서가 정해져 있지 않습니다.
    • 그래서 임의 키 탐색에는 부적합합니다(일반적으로 O(n)).

4.5 한 줄 선택 기준

  • 인덱스 접근이 잦다 → 배열
  • 이미 손에 쥔 위치에서 삽입·삭제가 잦다 → (양방향) 연결 리스트
  • 가장 최근 것부터 처리 → 스택 / 들어온 순서대로 처리 → 큐
  • 가장 우선순위 높은 것부터 반복 처리 → 힙
  • 키 순서를 유지하며 탐색·갱신이 잦다 → 균형 BST

5. 탐색

  • 앞에서부터 하나씩 비교합니다. 정렬이 필요 없습니다.
  • 시간 복잡도: 최악 O(n), 평균도 O(n).
  • 연결 리스트에도 그대로 적용할 수 있습니다.
  • 전제 조건 두 가지:
    1. 탐색 범위가 정렬되어 있을 것.
    2. 중앙 위치에 직접(임의) 접근할 수 있을 것 (배열처럼 인덱스로 O(1) 접근).
  • 비교할 때마다 범위가 절반으로 줄어 O(log n).
  • 정렬된 연결 리스트라도 자동으로 O(log n)이 되지는 않습니다. 중앙 노드에 가려면 링크를 따라 이동해야 하고, 이동량이 대략 n/2 + n/4 + … 로 합계 O(n)이 됩니다. 비교 횟수는 log 수준이어도 접근 비용이 O(n)이므로 이점이 사라집니다.

5.3 이 글의 비교 횟수 규칙 (예제·문제 공통)

정확한 횟수를 세기 전에 규칙을 먼저 정합니다.

  • 선형 탐색: 원소 하나와 목표값을 비교하는 것을 1회로 셉니다. 정렬된 배열이어도 “목표보다 큰 값이 나오면 중단”하는 조기 종료는 하지 않는 기본형으로 셉니다.
  • 이진 탐색: 인덱스는 0부터, 처음 low = 0, high = n − 1. 중앙은 mid = ⌊(low + high) / 2⌋ (소수점 이하 버림). A[mid]와 목표값을 비교해 “같다/작다/크다”를 판정하는 것을 **1회(1 프로브)**로 셉니다.
    • 같으면 종료, A[mid] < 목표이면 low = mid + 1, A[mid] > 목표이면 high = mid − 1. low > high가 되면 “없음”으로 종료합니다.
    • 참고: 교재에 따라 “같은지”와 “작은지”를 따로 2회로 세기도 하므로, 시험 문제에서는 문제의 규칙을 우선하세요.
  • 이 규칙에서 크기 n 배열의 이진 탐색 최대 프로브 수는 ⌊log₂ n⌋ + 1 입니다.

5.4 해시 표 탐색에 대한 짧은 메모

실러버스의 같은 항목에는 해시 표 탐색법과 시노님(충돌) 대책도 용어 예로 나옵니다. 해시 함수가 키를 고르게 분산하고 적재율이 낮게 유지되면 평균적으로 O(1)에 가깝지만, 충돌이 한곳에 몰리면 최악 O(n)까지 나빠질 수 있습니다. 충돌 대책으로는 체인법, 개방 주소법 등이 있습니다. 이 회에서는 여기까지만 다룹니다.


6. 정렬

6.1 알고리즘별 핵심

  • 버블 정렬: 인접한 두 원소를 비교·교환하는 패스를 반복합니다. 패스 1회마다 남은 범위의 최대값이 끝으로 이동합니다. “교환이 한 번도 없으면 종료” 플래그(조기 종료)를 둔 경우에만 이미 정렬된 입력에서 최선 O(n). 평균·최악 O(n²). 안정, 제자리.
  • 선택 정렬: 남은 범위에서 최솟값을 찾아 맨 앞과 교환합니다. 입력과 무관하게 비교 횟수가 n(n−1)/2 이므로 모든 경우 O(n²). 멀리 떨어진 원소를 교환하므로 일반적으로 불안정. 제자리.
  • 삽입 정렬: 정렬된 앞부분에 다음 키를 알맞은 위치에 끼워 넣습니다. 표준 구현에서 이미 정렬되었거나 거의 정렬된 입력이면 최선 O(n). 평균·최악 O(n²). 안정, 제자리.
  • 셸 정렬: 간격(gap)을 두고 떨어진 원소끼리 삽입 정렬을 하고, 간격을 점점 줄여 마지막에 간격 1로 마무리하는 삽입 정렬 계열입니다. 시간 복잡도는 간격 수열에 따라 달라지며, 하나의 보편적 상한으로 말할 수 없습니다. 일반적으로 불안정.
  • 병합(머지) 정렬: 정렬된 작은 묶음(런)을 두 개씩 병합해 키워 갑니다. 모든 경우 O(n log n). 안정. 배열에서의 전형적 구현은 O(n) 보조 공간이 필요합니다.
  • 퀵 정렬: 피벗을 기준으로 작은 쪽/큰 쪽으로 분할하는 과정을 반복합니다. 평균 O(n log n), 최악 O(n²)(예: 이미 정렬된 입력에서 항상 맨 끝을 피벗으로 고르는 경우). 일반적으로 불안정. 공간은 구현·재귀 스택·피벗 전략에 따라 다릅니다(분할 자체는 제자리로 할 수 있지만, 호출 스택이 평균적으로 O(log n), 단순 구현의 최악에는 O(n)까지 쓰일 수 있음).
  • 힙 정렬: 배열을 최대 힙으로 만든 뒤, 루트(최대값)를 끝과 교환하고 힙을 재구성하는 것을 반복합니다. O(n log n). 제자리. 일반적으로 불안정.

6.2 비교표

알고리즘 최선 평균 최악 보조 공간 안정성 제자리
버블 (조기 종료 있음) O(n) O(n²) O(n²) O(1) 안정 예
선택 O(n²) O(n²) O(n²) O(1) 일반적으로 불안정 예
삽입 (표준 구현) O(n) O(n²) O(n²) O(1) 안정 예
셸 간격 수열에 의존 간격 수열에 의존 간격 수열에 의존 O(1) 일반적으로 불안정 예
병합 (배열 구현) O(n log n) O(n log n) O(n log n) O(n) 안정 아니오 (전형적 구현)
퀵 O(n log n) O(n log n) O(n²) 구현·스택·피벗 전략에 의존 일반적으로 불안정 분할은 제자리 가능
힙 O(n log n)※ O(n log n) O(n log n) O(1) 일반적으로 불안정 예

※ 서로 다른 키를 가정. 조기 종료 플래그가 없는 버블 정렬은 최선도 O(n²)입니다.

6.3 안정성이란

같은 키를 가진 원소들의 원래 상대 순서가 정렬 후에도 유지되면 안정 정렬입니다. 예: 선택 정렬로 [2a, 2b, 1](a, b는 원래 순서 표시)을 정렬하면, 최솟값 1을 맨 앞 2a와 교환해 [1, 2b, 2a]가 됩니다. 2a와 2b의 순서가 뒤바뀌었으므로 이 입력에서 선택 정렬은 불안정합니다.


7. 예제 풀이

예제 1: 상황별 자료구조 선택

상황 선택 이유
센서 값을 끝에 계속 추가하고, “k번째 값”을 자주 읽는다 동적 배열 인덱스 접근 O(1), 끝 추가는 분할 상환 O(1)
편집기에서 “실행 취소” 스택 가장 최근 작업부터 되돌림 (LIFO)
프린터 작업을 도착 순서대로 처리 큐 FIFO
응급도가 가장 높은 환자부터 반복 처리, 수시로 새 환자 추가 힙 (우선순위 큐) 삽입·최댓값 꺼내기 O(log n)
회원 ID 순서를 유지하며 탐색·추가·삭제가 잦고, 범위 조회도 필요 균형 BST 탐색·갱신 O(log n), 중위 순회로 순서대로 나열 가능
커서가 가리키는 노드를 이미 알고 있고, 그 자리에서 삽입·삭제가 잦다 양방향 연결 리스트 노드와 링크를 알고 있으므로 O(1)

예제 2: 스택과 큐의 상태 변화

같은 순서로 A, B를 넣고 1개 꺼내고, C, D를 넣고 2개 꺼냅니다. 상태는 왼쪽이 “먼저 들어온 쪽”입니다.

스택 (오른쪽 끝이 top)

단계 연산 꺼낸 값 상태
0 (시작) – [ ]
1 push A – [A]
2 push B – [A, B]
3 pop B [A]
4 push C – [A, C]
5 push D – [A, C, D]
6 pop D [A, C]
7 pop C [A]

꺼낸 순서: B, D, C. 남은 것: [A].

큐 (왼쪽 끝이 front)

단계 연산 꺼낸 값 상태
0 (시작) – [ ]
1 enqueue A – [A]
2 enqueue B – [A, B]
3 dequeue A [B]
4 enqueue C – [B, C]
5 enqueue D – [B, C, D]
6 dequeue B [C, D]
7 dequeue C [D]

꺼낸 순서: A, B, C. 남은 것: [D].

예제 3: 선형 탐색 vs 이진 탐색

정렬된 배열 (인덱스 0~9, n = 10):

인덱스 0 1 2 3 4 5 6 7 8 9
값 3 8 12 17 21 26 30 34 41 47

규칙은 5.3절과 같습니다.

(a) 34 찾기

  • 선형 탐색: 3, 8, 12, 17, 21, 26, 30, 34 → 8회 (인덱스 7에서 발견).
  • 이진 탐색:
프로브 low high mid A[mid] 판정
1 0 9 4 21 21 < 34 → low = 5
2 5 9 7 34 발견

→ 2회.

(b) 10 찾기 (없는 값)

  • 선형 탐색: 조기 종료 없는 기본형이므로 10개 모두 비교 → 10회 후 “없음”.
  • 이진 탐색:
프로브 low high mid A[mid] 판정
1 0 9 4 21 21 > 10 → high = 3
2 0 3 1 8 8 < 10 → low = 2
3 2 3 2 12 12 > 10 → high = 1
– 2 1 – – low > high → 없음

→ 3회.

(c) 최악의 경우: n = 10이면 ⌊log₂ 10⌋ + 1 = 3 + 1 = 4회. 예: 47을 찾으면 mid = 4(21), 7(34), 8(41), 9(47)로 4회.

예제 4: 정렬 패스 추적

입력: [5, 2, 9, 1, 6] (오름차순).

(a) 버블 정렬 — 왼쪽부터 인접 쌍을 비교하고, 왼쪽이 크면 교환. 비교 1회 = 인접 두 원소 비교 1번.

패스 1 (비교 4회):

비교 쌍 교환? 결과
(5, 2) 예 [2, 5, 9, 1, 6]
(5, 9) 아니오 [2, 5, 9, 1, 6]
(9, 1) 예 [2, 5, 1, 9, 6]
(9, 6) 예 [2, 5, 1, 6, 9]

→ 비교 4회, 교환 3회. 최댓값 9가 맨 끝에 확정.

패스 2 (확정된 끝을 제외하고 비교 3회): (2, 5) 교환 없음 → (5, 1) 교환 [2, 1, 5, 6, 9] → (5, 6) 교환 없음. 비교 3회, 교환 1회.

패스 3 (비교 2회): (2, 1) 교환 [1, 2, 5, 6, 9] → (2, 5) 교환 없음. 비교 2회, 교환 1회.

패스 4 (비교 1회): (1, 2) 교환 없음.

합계: 비교 4 + 3 + 2 + 1 = 10회 (= n(n−1)/2), 교환 5회. 참고: 이미 정렬된 5개 입력이라면, 조기 종료 플래그가 있을 때 패스 1에서 비교 4회(= n − 1), 교환 0회로 종료합니다.

(b) 삽입 정렬 — 같은 입력. 비교 1회 = 꺼낸 키와 정렬된 부분의 원소 1개 비교. 배열 맨 앞에 도달해 멈추는 것은 비교로 세지 않습니다. “이동” = 원소를 오른쪽으로 한 칸 미는 것.

단계 키 비교 내용 비교 이동 결과
1 2 5 > 2 (이동), 맨 앞 도달 1 1 [2, 5, 9, 1, 6]
2 9 5 > 9? 아니오 → 정지 1 0 [2, 5, 9, 1, 6]
3 1 9 > 1, 5 > 1, 2 > 1 (모두 이동), 맨 앞 도달 3 3 [1, 2, 5, 9, 6]
4 6 9 > 6 (이동), 5 > 6? 아니오 → 정지 2 1 [1, 2, 5, 6, 9]

합계: 비교 7회, 이동 5회. 버블의 교환 5회, 삽입의 이동 5회는 모두 입력의 역순쌍 수(5, 2), (5, 1), (2, 1), (9, 1), (9, 6) = 5개와 일치합니다. “같으면 이동하지 않는다(>로 비교)” 규칙 덕분에 삽입 정렬은 안정합니다.

(c) 병합 정렬의 라운드 — 입력 [6, 3, 8, 1, 7, 2, 5, 4] (n = 8). 길이 1의 런에서 시작해 이웃한 두 런을 병합합니다. 비교 1회 = 두 런의 맨 앞 원소끼리 비교 1번. 한쪽 런이 바닥나면 나머지는 비교 없이 복사합니다.

라운드 결과 비교 횟수
1 (1+1 → 2) [3, 6] [1, 8] [2, 7] [4, 5] 1 + 1 + 1 + 1 = 4
2 (2+2 → 4) [1, 3, 6, 8] [2, 4, 5, 7] 3 + 3 = 6
3 (4+4 → 8) [1, 2, 3, 4, 5, 6, 7, 8] 7

합계 비교 17회. 라운드 수는 log₂ 8 = 3이고, 각 라운드마다 8개 원소를 모두 옮기므로 전체 작업량이 n log n 차수가 됩니다. 병합 결과를 담을 별도 배열이 필요하므로 보조 공간 O(n)입니다.


8. 오리지널 연습문제 4문항

아래 4문항은 모두 이 글을 위해 독자적으로 작성한 오리지널 문제이며, 기출문제를 사용하지 않았습니다. 선택지 기호는 IPA 시험 형식을 따라 ア・イ・ウ・エ를 씁니다.

문제 1 (자료구조 선택)

원소 수 n이 크고, 다음 두 연산이 모두 자주 실행된다. 각 연산의 최악 시간 복잡도가 모두 O(log n) 이하가 되도록 하고 싶다. 배열을 쓰는 경우 용량은 미리 충분히 확보되어 있어 재할당은 일어나지 않는다고 한다.

  • 새 원소(우선순위 값 포함)를 추가한다.
  • 현재 우선순위가 가장 높은 원소를 꺼낸다.

가장 적절한 자료구조는 어느 것인가?

  • ア 정렬하지 않은 배열 (끝에 추가)
  • イ 우선순위 내림차순으로 정렬해 둔 단방향 연결 리스트
  • ウ 이진 힙 (최대 힙)
  • エ 큐 (FIFO)

정답: ウ

풀이:

  • ア: 추가는 끝에 넣으므로 O(1)이지만, 최댓값을 꺼내려면 전체를 훑어야 해 O(n). 조건 불충족.
  • イ: 꺼내기는 머리 노드를 떼므로 O(1)이지만, 추가할 때 알맞은 위치를 찾아 링크를 따라가야 해 최악 O(n). 조건 불충족.
  • ウ: 추가는 끝에 넣고 위로 올리며(최대 높이 ⌊log₂ n⌋) O(log n), 꺼내기는 루트를 빼고 아래로 재구성하며 O(log n). 두 연산 모두 조건 충족. 정답.
  • エ: FIFO라서 꺼내는 것은 “가장 먼저 들어온 원소”이지 우선순위가 가장 높은 원소가 아닙니다. 우선순위로 고르려면 전체를 훑어야 해 O(n). 조건 불충족.

문제 2 (스택·큐 상태 변화)

빈 스택 S와 빈 큐 Q가 있다. 다음 연산을 순서대로 실행한다.

  1. S에 push 1
  2. S에 push 2
  3. S에 push 3
  4. S에서 pop한 값을 Q에 enqueue
  5. S에서 pop한 값을 Q에 enqueue
  6. S에 push 4
  7. S에서 pop한 값을 Q에 enqueue

그 후 Q가 빌 때까지 dequeue를 반복한다. 꺼내지는 값의 순서는 어느 것인가?

  • ア 4, 2, 3
  • イ 3, 2, 4
  • ウ 1, 2, 3
  • エ 3, 2, 1

정답: イ

풀이 (상태 추적):

단계 S (오른쪽이 top) Q (왼쪽이 front)
1~3 [1, 2, 3] [ ]
4 [1, 2] (3을 pop) [3]
5 [1] (2를 pop) [3, 2]
6 [1, 4] [3, 2]
7 [1] (4를 pop) [3, 2, 4]

Q에서 dequeue하면 들어간 순서대로 3, 2, 4. S에는 1이 남습니다.

  • ア 4, 2, 3: Q를 LIFO처럼 마지막에 넣은 것부터 꺼낸 오답.
  • イ 3, 2, 4: 위 추적 결과와 일치. 정답.
  • ウ 1, 2, 3: S를 FIFO처럼 처리한 오답. (그렇게 하면 4·5단계에서 1, 2를 꺼내고, 6단계 후 S = [3, 4]에서 7단계에 3을 꺼내 Q = [1, 2, 3]이 됩니다.)
  • エ 3, 2, 1: 6단계의 push 4를 무시하거나 7단계 뒤에 실행한 것으로 착각해, 7단계에서 1을 꺼낸 오답.

문제 3 (이진 탐색의 조건과 비교 횟수)

다음 배열 B(인덱스 0~14, n = 15)에서 51을 이진 탐색한다. 규칙은 5.3절과 같다(mid = ⌊(low + high) / 2⌋, A[mid]와의 3방향 판정 1번을 1회로 셈).

인덱스 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
값 4 9 13 18 22 27 31 36 40 45 51 56 62 68 75

비교 횟수와 이진 탐색의 적용 조건을 모두 올바르게 나타낸 것은 어느 것인가?

  • ア 3회. 데이터가 정렬되어 있기만 하면 연결 리스트에서도 같은 효율로 적용할 수 있다.
  • イ 4회. 데이터가 정렬되어 있지 않은 배열에도 적용할 수 있다.
  • ウ 11회. 데이터가 정렬되어 있어야 한다.
  • エ 4회. 데이터가 정렬되어 있고, 중앙 위치에 직접 접근할 수 있어야 한다.

정답: エ

풀이 (추적):

프로브 low high mid B[mid] 판정
1 0 14 7 36 36 < 51 → low = 8
2 8 14 11 56 56 > 51 → high = 10
3 8 10 9 45 45 < 51 → low = 10
4 10 10 10 51 발견

→ 4회. (n = 15의 최대 프로브 수 ⌊log₂ 15⌋ + 1 = 4와도 일치.)

  • ア: 횟수가 틀림(⌊log₂ 15⌋ = 3을 횟수로 착각한 값). 또한 연결 리스트는 중앙 노드에 O(1)로 접근할 수 없어 접근 비용이 O(n)이 되므로 “같은 효율”이 아닙니다.
  • イ: 횟수는 맞지만, 정렬되지 않은 배열에서는 “절반을 버리는” 판단이 성립하지 않아 이진 탐색을 쓸 수 없습니다.
  • ウ: 11회는 선형 탐색으로 인덱스 10에 도달할 때의 비교 횟수(4, 9, …, 51의 11개)입니다. 이진 탐색의 횟수가 아닙니다.
  • エ: 횟수 4회와 두 조건(정렬, 직접 접근)이 모두 올바름. 정답.

문제 4 (정렬의 동작·복잡도·안정성)

정렬 알고리즘에 관한 설명으로 올바른 것은 어느 것인가?

  • ア 표준적인 구현의 삽입 정렬은, 이미 오름차순으로 정렬된 n개의 데이터를 오름차순으로 정렬할 때 키 비교가 n − 1회이며, 안정 정렬이다.
  • イ 퀵 정렬은 피벗을 어떻게 고르든 최악 시간 복잡도가 O(n log n)이다.
  • ウ 선택 정렬은 이미 정렬된 데이터에 대해 O(n)으로 끝난다.
  • エ 힙 정렬은 안정 정렬이며, 입력과 같은 크기의 보조 배열(O(n))을 필요로 한다.

정답: ア

풀이:

  • ア: 각 키(2번째~n번째, 총 n − 1개)는 바로 앞 원소와 1번 비교해 “앞 원소 ≤ 키”이므로 곧바로 멈춥니다. 따라서 비교 n − 1회, 이동 0회. 같은 키는 넘어가지 않으므로 안정. 정답.
  • イ: 피벗이 매번 최솟값이나 최댓값이 되면(예: 정렬된 입력에서 항상 끝을 피벗으로 선택) 분할이 한쪽으로 치우쳐 최악 O(n²)가 됩니다.
  • ウ: 선택 정렬은 입력과 무관하게 최솟값을 찾기 위해 n(n−1)/2회 비교하므로 항상 O(n²).
  • エ: 힙 정렬은 배열 안에서 힙을 구성·재구성하는 제자리 정렬(보조 공간 O(1))이며, 일반적으로 불안정합니다. 두 부분 모두 틀림.

9. 복잡도 퀵 시트

항목 값 조건·주의
배열 인덱스 접근 O(1) 연속 배치
배열 중간 삽입·삭제 O(n) 시프트 필요
동적 배열 끝 추가 분할 상환 O(1) 재할당 시 그 1회는 O(n)
연결 리스트 위치 접근·탐색 O(n) 링크 따라가기
연결 리스트 삽입·삭제 O(1) 위치(노드)와 링크를 이미 알 때만
스택 push/pop, 큐 enqueue/dequeue O(1) 일반적 구현
균형 BST 탐색·삽입·삭제 O(log n) AVL 트리 등
일반 BST 탐색 최악 O(n) 치우친 트리
힙 최댓값 확인 / 삽입·꺼내기 O(1) / O(log n) 임의 키 탐색은 O(n)
선형 탐색 O(n) 정렬 불필요
이진 탐색 O(log n), 최대 ⌊log₂ n⌋ + 1 회 정렬 + 직접 접근, 이 글의 계수 규칙
선택 정렬 비교 횟수 n(n−1)/2 항상
버블 정렬 비교 (조기 종료 없음) n(n−1)/2 항상
정렬된 입력: 버블(조기 종료)·삽입 비교 n − 1 회 O(n)

10. 자주 하는 실수

  • “연결 리스트는 삽입이 O(1)” → 위치를 이미 알 때만. 찾는 과정은 O(n).
  • “동적 배열 추가는 항상 O(1)” → 분할 상환 O(1). 재할당 순간은 O(n).
  • “정렬되어 있으면 이진 탐색 가능” → 직접 접근도 필요. 정렬된 연결 리스트는 O(log n)이 되지 않음.
  • “힙은 정렬된 구조” → 부모-자식 순서만 보장. 임의 키 탐색에 부적합.
  • “BST 탐색은 O(log n)” → 균형일 때. 치우치면 O(n).
  • “버블 정렬 최선 O(n)” → 조기 종료 플래그가 있을 때만.
  • “퀵 정렬은 O(n log n)” → 평균. 최악은 O(n²).
  • “병합 정렬은 제자리” → 배열의 전형적 구현은 O(n) 보조 공간.
  • “셸 정렬은 O(n^1.5)” 같은 단정 → 간격 수열에 따라 다름.
  • “O(n log n)이면 항상 O(n²)보다 빠르다” → Big-O는 증가 차수. 작은 n에서는 역전 가능.
  • 「内部ソート」를 제자리 정렬로 착각.
  • 이진 탐색 횟수를 셀 때 문제의 mid 규칙·계수 규칙을 확인하지 않음.

11. 최종 자기 점검

다음 질문에 답할 수 있으면 체크하세요.

  • 배열과 연결 리스트의 접근·삽입 비용을 조건과 함께 말할 수 있다.
  • 동적 배열 끝 추가가 “분할 상환 O(1)“인 이유를 설명할 수 있다.
  • 스택과 큐에 같은 연산을 했을 때 꺼내지는 순서를 표로 추적할 수 있다.
  • 힙이 우선순위 큐에 적합하지만 임의 키 탐색에는 부적합한 이유를 말할 수 있다.
  • 이진 탐색의 두 전제 조건을 말하고, 정렬된 연결 리스트가 O(log n)이 안 되는 이유를 설명할 수 있다.
  • 주어진 mid 규칙으로 이진 탐색 프로브 수를 정확히 셀 수 있다.
  • 6가지 정렬의 최선/평균/최악, 보조 공간, 안정성을 표 없이 말할 수 있다.
  • 셸 정렬의 복잡도를 하나로 단정하면 안 되는 이유를 말할 수 있다.
  • 버블 1패스, 삽입 1키를 손으로 추적하고 비교 횟수를 셀 수 있다.

12. 복습 제안 (1일/3일/7일)

아래는 학습 데이터에 근거한 것이 아닌, 일반적인 간격 복습 제안입니다. 본인의 일정에 맞게 조정하세요.

  • 1일 후: 용어 대조표와 퀵 시트를 가리고 다시 써 보기. 예제 2(스택·큐)를 처음부터 다시 추적.
  • 3일 후: 예제 3·4의 숫자를 바꿔(예: 다른 목표값, 다른 입력 배열) 직접 추적하고 횟수 세기.
  • 7일 후: 연습문제 4문항을 풀이를 보지 않고 다시 풀고, 오답 선택지가 왜 틀렸는지 한 문장씩 설명하기.

13. 실러버스 대응

  • 대분류1:基礎理論/중분류2:アルゴリズムとプログラミング/1. データ構造/(2)データ構造の種類
  • 대분류1:基礎理論/중분류2:アルゴリズムとプログラミング/2. アルゴリズム/(2)代表的なアルゴリズム/①整列・併合・探索のアルゴリズム

원문 표기:

  • 大分類1:基礎理論/中分類2:アルゴリズムとプログラミング/1. データ構造/(2)データ構造の種類
  • 大分類1:基礎理論/中分類2:アルゴリズムとプログラミング/2. アルゴリズム/(2)代表的なアルゴリズム/①整列・併合・探索のアルゴリズム

14. 출처·참고

  • 공식 자료: IPA「応用情報技術者試験(レベル3)シラバス Ver.7.2」
  • 이 글의 개정일: 2026-10-20
  • 실러버스는 출제 범위 확인 용도로만 참조했습니다. 이 글의 설명, 예제, 연습문제는 모두 독자적으로 작성했으며, IPA의 검토나 보증을 받은 것이 아닙니다.

15. 범위 경계와 다음 회 예고

재귀의 동작 원리와 의사코드(擬似言語) 추적은 제6회에서 다룹니다.

블로그로