문제: BOJ 1258 - 문제 할당
각 학생이 각 문제를 푸는 데 걸리는 시간이 주어질 때, 모든 학생에게 서로 다른 문제를 하나씩 배정하여 총 시간을 최소화한다. \(N \le 100\) 이므로 헝가리안 알고리즘(Hungarian / Kuhn–Munkres) 으로 \(O(N^3)\)에 해결할 수 있다.
문제 정보
문제 링크: https://www.acmicpc.net/problem/1258
문제 요약:
- \(N \times N\) 비용 행렬 \(A\)가 주어진다. \(A_{i,j}\) = 학생 \(i\)가 문제 \(j\)를 푸는 시간.
- 각 학생에게 서로 다른 문제를 하나씩 할당(= 순열 선택)했을 때의 총합을 최소화한다.
제한 조건:
- 시간 제한: 5초
- 메모리 제한: 128MB
- \(1 \le N \le 100\)
- \(1 \le A_{i,j} \le 1000\)
입출력 예제
입력 1:
| |
출력 1:
| |
접근 방식
핵심 관찰
이 문제는 “행(학생)마다 열(문제) 하나씩, 열도 중복 없이 하나씩 선택”하는 할당 문제(Assignment Problem) 이며, 이는 가중 이분 그래프의 최소 비용 완전 매칭과 동치다.
\(N \le 100\) 이라서 \(O(N^3)\) 헝가리안 알고리즘이 충분히 빠르다.
알고리즘 설계 (Mermaid Flowchart)
flowchart TD
A["입력 N 및 비용 행렬 A"] --> B["헝가리안 알고리즘 초기화 (u, v, p, way)"]
B --> C["각 행 i를 하나씩 매칭에 추가"]
C --> D["감소 비용으로 최소 슬랙 갱신"]
D --> E["포텐셜(u, v) 갱신"]
E --> F["증가 경로로 매칭 보강"]
F --> G["모든 열 매칭 완료"]
G --> H["매칭 비용 합산 후 출력"]
단계별 로직
헝가리안 알고리즘(최소화 버전)의 대표 구현은 다음 형태로 진행된다.
- 포텐셜(dual variables) \(u, v\) 를 유지하여 감소 비용 \(c'_{i,j} = A_{i,j} - u_i - v_j\) 를 관리한다.
- 새 행 \(i\)를 매칭에 추가할 때, 현재 매칭에서 증가 경로를 찾아 열을 하나 비우고 \(i\)를 매칭한다.
- 탐색 중에는 각 열의 최소 슬랙(minv) 를 유지하고, 가장 작은 슬랙만큼 포텐셜을 한 번에 조정해 “0 감소 비용 간선”을 확장한다.
- 매칭이 완성되면, 열 기준으로 어떤 행이 배정되었는지 \(p[j]\)에 저장되어 있고, 이를 이용해 총합을 계산한다.
복잡도 분석
| 항목 | 복잡도 | 비고 |
|---|---|---|
| 시간 복잡도 | \(O(N^3)\) | 헝가리안 알고리즘 |
| 공간 복잡도 | \(O(N^2)\) | 비용 행렬 저장 |
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 방법 |
|---|---|---|
| N=1 | 원소 1개 | 그대로 출력 |
| 큰 합 | 합이 \(100 \times 1000 = 10^5\) 수준이지만 확장성 고려 | long long 사용 |
| 1-index / 0-index 혼동 | 헝가리안 구현에서 0번 열을 “가상 열”로 씀 | 배열 크기 \(N+1\), 0번 인덱스 주의 |
구현 코드
C++
| |
![Featured image of post [Algorithm] C++ 백준 1258번: 문제 할당](/post/algorithm/2025-12-23-boj-1258-problem-assignment-hungarian-cpp-solution/wordcloud_hu_79e97c4eada79272.png)
![[Algorithm] C++ 백준 12012번: Closing the Farm (Gold)](/post/algorithm/2025-12-23-boj-12012-closing-the-farm-dsu-offline-cpp-solution/wordcloud_hu_5a95d85e90d9352c.png)
![[Algorithm] C++ 백준 1258번: 문제 할당](/post/algorithm/2025-12-23-boj-1258-problem-assignment-hungarian-cpp-solution/wordcloud_hu_fb5f370a4bccc9ee.png)
![[Algorithm] C++ 백준 13028번: 민호의 소원](/post/algorithm/2025-12-22-boj-13028-minhos-wish-fenwick-offline-cpp-solution/wordcloud_hu_131d7568faac9120.png)
![[Algorithm] C++ 백준 13232번: Domain clusters](/post/algorithm/2025-12-22-boj-13232-domain-clusters-scc-tarjan-cpp-solution/wordcloud_hu_3a7a8d5f138b64d1.png)
![[Algorithm] C++ 백준 10050번: 블록](/post/algorithm/2025-12-20-boj-10050-block-cpp-solution/wordcloud_hu_ed188e3b2b566e60.png)
![[Algorithm] C++ 백준 2586번: 소방차](/post/algorithm/2025-12-19-boj-2586-firetruck-cpp-solution/wordcloud_hu_c7df555f7b0ecd9e.png)
![[Algorithm] C++ 백준 12918번: 정리정돈](/post/algorithm/2025-08-14-boj-12918-cleaning-up-mirror-symmetry-hungarian-cpp-solution/wordcloud_hu_992993152683211.png)
![[Algorithm] C++ 백준 1185번: 유럽여행](/post/algorithm/2025-12-19-boj-1185-europe-travel-mst-kruskal-cpp-solution/wordcloud_hu_a7973902548ef27b.png)