백준 2512번 예산 문제를 통해 알아보는 이분 탐색과 파라메트릭 서치의 완벽 이해와 활용법에 대한 상세 요약입니다.
1. 📋 문제 개요와 핵심 조건
- 국가의 역할은 여러 지방의 예산요청을 심사하여 국가 예산을 분배하는 것이다
- 예산 배정 규칙:
– 모든 요청이 배정 가능한 경우: 요청한 금액을 그대로 배정
– 모든 요청이 배정 불가능한 경우: 정수 상한액을 계산하여 초과분은 상한액만 배정
– 상한액 이하의 요청은 요청한 금액 그대로 배정
1.1. 문제 입출력 예시
– 예제 입력 1:
- 지방 수: 4
- 각 예산 요청: 120, 110, 140, 150
- 총예산: 485
- 출력: 127 (상한액)
– 예제 입력 2:
- 지방 수: 5
- 각 예산 요청: 70, 80, 30, 40, 100
- 총예산: 450
- 출력: 100 (상한액)
2. 🧩 문제 이해와 접근 전략
– 이 문제의 핵심 질문: “가능한 최대의 상한액은 얼마인가?”
– 상한액의 특성: 상한액보다 적게 요청한 지방은 요청 금액 그대로, 많이 요청한 지방은 상한액만 받음
– 예제 1의 경우: 상한액을 127로 설정하면 120, 110, 127, 127로 배정하여 총 484로 최적8
2.1. 브루트포스 접근법의 한계
- 상한액을 1부터 차례로 증가시키며 시뮬레이션하는 방법
- 문제점: 비효율적
– 최대 요청액이 100,000까지 가능하므로 시간 복잡도 O(N×M)에서 시간 초과 발생5
3. 🎯 파라메트릭 서치 접근법
3.1. 파라메트릭 서치의 개념
파라메트릭 서치란 최적화 문제를 결정 문제로 변환하여 푸는 기법이다513.
- 최적화 문제: 정해진 총액(M) 이하에서 최대 상한액(K)은 얼마인가?
- 결정 문제: 상한액이 K일 때 총 배정액이 M 이하가 되는가? (Yes/No)8
3.2. 이분 탐색과 파라메트릭 서치의 차이
– 이분 탐색: 정렬된 배열에서 특정 값을 찾는 알고리즘9
– 파라메트릭 서치: 주어진 범위 내에서 조건을 만족하는 값을 찾는 알고리즘9
– 파라메트릭 서치는 정렬이 필수 조건이 아닌 점이 다름8
4. 💻 알고리즘 구현 방법
4.1. 이분 탐색 구현 골격
def binary_search(array, value, low, high):
if low > high:
return False
mid = (low + high) // 2
if array[mid] > value:
return binary_search(array, value, low, mid-1)
elif array[mid] < value:
return binary_search(array, value, mid+1, high)
else:
return mid
4.2. 예산 문제 파라메트릭 서치 구현
import sys
input = sys.stdin.readline
N = int(input()) # 지방의 수
req = list(map(int, input().split())) # 각 지방 예산 요청
M = int(input()) # 총 예산
low = 0 # 탐색 범위 시작점
high = max(req) # 탐색 범위 종료점 (최대 요청액)
ans = 0 # 결과값
def is_possible(mid):
# 상한액이 mid일 때 배정 가능한지 확인
return sum(min(r, mid) for r in req) <= M
while low <= high:
mid = (low + high) // 2
if is_possible(mid): # 배정 가능하면
low = mid + 1 # 상한액을 높이기
ans = mid # 가능한 값 저장
else: # 배정 불가능하면
high = mid - 1 # 상한액을 낮추기
print(ans)
4.3. 핵심 함수 분석: is_possible()
5. 🔄 알고리즘 동작 과정
5.1. 예제 1의 실행 흐름
- 초기 설정: low=0, high=150(최대 요청), ans=0
- 1단계: mid=75
– 75로 배정 시 합계는 75+75+75+75=300 < 485
– 가능함: low=76, ans=75 - 2단계: mid=113
– 113 배정 시 합계: 120+110+113+113=456 < 485
– 가능함: low=114, ans=113 - 3단계: mid=126
– 126 배정 시 합계: 120+110+126+126=482 < 485
– 가능함: low=127, ans=126 - 4단계: mid=127
– 127 배정 시 합계: 120+110+127+127=484 < 485
– 가능함: low=128, ans=127 - 5단계: mid=128
– 128 배정 시 합계: 120+110+128+128=486 > 485
– 불가능: high=127 - 종료: low=129, high=127로 low>high 조건으로 종료
– 정답: ans=127
6. 🧠 파라메트릭 서치 설계 원칙
6.1. 성공 조건
6.2. 구현 시 주의사항
7. 📊 시간 복잡도 분석
- 브루트포스: O(N×M) → 최대 10,000×100,000 = 10억 연산 필요5
- 파라메트릭 서치: O(N×log M) → 10,000×log(100,000) ≈ 10,000×17 = 17만 연산5
- 1초 제한에서 연산 상한은 약 1억이므로 파라메트릭 서치만 시간 내 해결 가능5
8. 📚 유사 문제와 응용
9. 🔑 결론
파라메트릭 서치는 단순한 이분 탐색의 응용이 아닌, 최적화 문제를 효율적으로 해결하는 강력한 알고리즘 기법이다. 백준 2512번 예산 문제는 이 기법의 전형적인 응용 사례로, 최적화 문제를 결정 문제로 변환하여 효율적으로 해결하는 패러다임을 보여준다12. 상한액이라는 파라미터를 조정하며 가능성을 판단하는 과정이 파라메트릭 서치의 본질이며, 이를 통해 큰 탐색 공간도 로그 시간에 처리할 수 있다5.
Citations:
- https://sarah950716.tistory.com/16
- http://subinium.github.io/Algorithm/docs/chapter03/4.html
- https://great-park.tistory.com/44
- https://yes6686.tistory.com/195
- https://velog.io/@lake/%EC%9D%B4%EB%B6%84%ED%83%90%EC%83%89-%ED%8C%8C%EB%9D%BC%EB%A9%94%ED%8A%B8%EB%A6%AD-%EC%84%9C%EC%B9%98Parametric-Search
- https://codingsmu.tistory.com/135
- https://velog.io/@wjdrbs786/Java-%EB%B0%B1%EC%A4%80-BOJ-2512%EB%B2%88-%EC%98%88%EC%82%B0
- https://loosie.tistory.com/552
- https://marades.tistory.com/7
- https://tooo1.tistory.com/129
- https://alive-wong.tistory.com/68
- https://spookyjelly.tistory.com/36
- https://9327144.tistory.com/entry/%ED%8C%8C%EB%9D%BC%EB%A9%94%ED%8A%B8%EB%A6%AD-%EC%84%9C%EC%B9%98Parametric-Search
- https://velog.io/@zerohyun__/%EB%B0%B1%EC%A4%80-2512
- https://blog.naver.com/jinhan814/222156334908
- https://www.acmicpc.net/problem/2512
- https://velog.io/@sorzzzzy/Algorithm-%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89-%ED%8C%8C%EB%9D%BC%EB%A9%94%ED%8A%B8%EB%A6%AD-%EC%84%9C%EC%B9%98
- https://m42-orion.tistory.com/70
- https://loosie.tistory.com/518
- https://david0506.tistory.com/2
- https://ialy1595.github.io/post/parametric-search/
- https://amepistheo.tistory.com/5
- https://velog.io/@sh93/%EB%B0%B1%EC%A4%80-2512%EB%B2%88-%EC%98%88%EC%82%B0-.-python
- https://jy-tblog.tistory.com/36
- https://chanmuzi.tistory.com/237
- https://sdy-study.tistory.com/90
- https://stdio-han.tistory.com/112
- https://beginthread.tistory.com/30
- https://claude-u.tistory.com/447
- https://velog.io/@nuri00/%EB%B0%B1%EC%A4%80-2512%EB%B2%88-%EC%98%88%EC%82%B0
- https://ulwunr.tistory.com/11