본문으로 건너뛰기
자료구조 · 알고리즘 기초집LESSON 12

병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기

난이도초급 → 중급 입문
예상 시간40분
선수지식이전 강의

12강. 병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기

1. 이번 강의에서 해결할 문제

O(n²) 정렬은 입력이 커질수록 비교 수가 급격히 늘어납니다. 문제를 균형 있게 나누고 결과를 합치는 전략이 필요합니다.

2. 학습 목표

3. 핵심 개념

분할 정복은 문제를 작은 같은 형태의 문제로 나누고, 각각 해결한 뒤 결합합니다. 병합 정렬은 길이 0 또는 1이면 이미 정렬된 것으로 보고, 중간을 기준으로 두 구간을 정렬한 다음 작은 값부터 임시 배열에 병합합니다. 깊이는 O(log n), 각 깊이 전체 병합 비용은 O(n)이라 모든 상황에서 O(n log n)입니다.

4. 단계별 실습

1. 예제 파일 작성

실행 환경: 코드 편집기

실행 위치: C:\dev\game-ranking-algorithms

실행 전 확인: 같은 이름의 파일이 있다면 덮어쓰기 전에 Git diff로 변경 범위를 확인합니다. 선택한 LTS JDK의 java -versionjavac -version이 모두 실행되어야 합니다.

대상 파일: src/MergeSortDemo.java

src/MergeSortDemo.java
import java.util.Arrays;

public class MergeSortDemo {
static void sort(int[] values) { sort(values, new int[values.length], 0, values.length); }
static void sort(int[] a, int[] temp, int from, int to) {
if (to - from <= 1) return;
int mid = from + (to - from) / 2;
sort(a, temp, from, mid);
sort(a, temp, mid, to);
int i = from, j = mid, k = from;
while (i < mid && j < to) temp[k++] = a[i] <= a[j] ? a[i++] : a[j++];
while (i < mid) temp[k++] = a[i++];
while (j < to) temp[k++] = a[j++];
for (k = from; k < to; k++) a[k] = temp[k];
}

public static void main(String[] args) {
int[] scores = {1300, 700, 1500, 900, 900};
sort(scores);
System.out.println(Arrays.toString(scores));
}
}

2. PowerShell에서 컴파일·실행

실행 환경: Windows PowerShell

실행 위치: C:\dev\game-ranking-algorithms

실행 전 확인: src/MergeSortDemo.java가 저장되었고 out 폴더에는 삭제해도 되는 컴파일 결과만 있는지 확인합니다.

대상: src/MergeSortDemo.javaout 아래 생성되는 class 파일

Windows PowerShell
Set-Location C:\dev\game-ranking-algorithms
New-Item -ItemType Directory -Force .\out | Out-Null
javac -Xlint:all -d .\out .\src\MergeSortDemo.java
java -cp .\out MergeSortDemo

예상 결과: [700, 900, 900, 1300, 1500]이 출력됩니다.

실행 시간은 PC의 CPU·메모리, JDK 버전, JVM 워밍업, 백그라운드 작업과 입력 분포에 따라 달라질 수 있습니다. 측정값은 같은 조건에서 여러 번 비교하고 Big-O 분석과 함께 해석합니다.

5. 코드와 알고리즘이 동작하는 이유

각 재귀 호출은 반 열린 구간 [from, to)를 다뤄 경계를 일관되게 합니다. <=일 때 왼쪽 값을 먼저 선택하면 같은 키의 상대 순서를 유지하는 안정 정렬이 됩니다. 보조 배열은 O(n), 재귀 스택은 O(log n)이며 전체 시간은 최선·평균·최악 O(n log n)입니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2‘종료 조건 없이 길이 1도 다시 나누기’ 실수를 판단할 때 “병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

12강. 병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기 미완료 상태