# 문제
백준 2512 예산 파이썬 풀이
# 코드
import sys
N = int(sys.stdin.readline()) # 지방의 수
cites = list(map(int,sys.stdin.readline().split()))
MAX = int(sys.stdin.readline()) # 최대 예산
left = 1
right = max(cites) # MAX 잡았었는데 틀렸음. 예산이 도시에 들어가는 것보다 작을 수 있음
result = -1
while left <= right :
mid = (left + right) // 2
used_money = 0
for city in cites :
if mid <= city :
used_money += mid
else :
used_money += city
if MAX < used_money : # 돈을 더 많이 쓴 경우
right = mid - 1
else :
# MAX > used_money
left = mid + 1
result = mid
print(result)
# 풀이
- 이분탐색을 이용해서 풀 수 있다. 이분탐색을 풀이에 적용할때는 이분탐색을 진행하면서 나오는 mid값이 후보가 되어, mid를 사용해서 문제의 조건을 계산했을때 이것을 만족하나 안하나 (YES / NO )의 여부로 생각하면 쉽다.
- 위 문제에서도 이분탐색으로 뽑은 mid가 예산의 후보가 된다. 해당 값으로 계산 했을때 예산을 초과한다면 예산을 늘려주고, 예산을 초과하지 않는다면 예산을 줄여줘서 최적의 값을 찾아가는 형식이다.
- 이분탐색은 상상외로 빠르다. log N 이기 때문에 10억의 값이 있더라도 30번이면 정답을 찾을 수 있다.
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준15686&파이썬] 조합을 이용해 브루트포스(완전탐색)해결하기 (0) | 2023.04.29 |
---|---|
[백준2294&파이썬] DP를 이용하여 동전교환문제를 해결하기, DP는 값을 재활용한다. (0) | 2023.04.28 |
[백준1939&파이썬] 이진탐색 BFS에 응용하기, 이진탐색 경계값 설정에 주의하자. (0) | 2023.04.27 |
[백준16236&파이썬] BFS을 작은단위로 쪼개 생각하자. 종료조건과 탐색조건을 잘 생각하자. (0) | 2023.04.26 |
[백준6497&파이썬] 크루스칼은 최소신장트리를 구할 수 있다. (0) | 2023.04.26 |