본문으로 건너뛰기
자료구조 · 알고리즘 기초집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 -version과 javac -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.java와 out 아래 생성되는 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강. 병합 정렬과 분할 정복: 큰 문제를 나누어 정렬하기 미완료 상태