2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
알고리즘 생각
- 예산을 낭비하지 않고 최대로 사용할 수 있는 `상한선`을 구하는 것이 목표
- 평균값을 내림으로 계산하면 일단 예산을 넘지 않는 `상한선`을 만들 수 있다
- 이 `상한선`은 최대치가 아니라 예산이 분명 낭비된다. 여기서부터 최소 단위씩 올려가면서 비교해야한다.
구현방법 및 코드
- 빈 배열을 만들고, 조건에 맞게 초기화해가면서 계속 비교해나간다.
- 이 과정에서 len() 과 sum() 함수를 사용하니 매우 편했다
import math
n = int(input())
budgets = list(map(int,input().split( )))
total_budget = int(input())
if sum(budgets) <= total_budget:
print(max(budgets))
else:
temp_budgets = []
avg_budget = math.floor(total_budget / n)
for budget in budgets:
if avg_budget >= budget:
temp_budgets.append(budget)
max_budget = (math.floor((total_budget-sum(temp_budgets))/(n-len(temp_budgets))))
while max_budget *(n-len(temp_budgets)) +sum(temp_budgets) <= total_budget:
max_budget += 1
temp_budgets = []
for budget in budgets:
if max_budget >= budget:
temp_budgets.append(budget)
print(max_budget-1)
후기
- 이분 탐색을 이용하는 알고리즘 문제라 하는데, 그리디로 풀어버린 거 같다... 솔직히 어떻게 이분 탐색을 생각하는 지가 더 신기하다..
- leetcode였으면 메모리 초과나 시간 초과 나서 터졌을 거 같다.. 코드를 list가 아니라 cnt로 바꾸면 더 좋을 거 같은데 다음에는 그렇게 해야겠다
'TIL > 이전 풀이' 카테고리의 다른 글
| [python] Leetcode 34. Find First and Last Position of Element in Sorted Array (0) | 2022.12.13 |
|---|---|
| [python] Leetcode 15. 3Sum (1) | 2022.12.13 |
| BOJ_12904: A와 B (0) | 2022.10.31 |
| boj_2839_설탕 배달 (0) | 2022.10.24 |
| boj_1009_분산처리 (1) | 2022.10.05 |