56 lines
2.5 KiB
Python
56 lines
2.5 KiB
Python
# 예산
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
|
|
def solution():
|
|
n = int(input().rstrip())
|
|
req = list(map(int, input().rstrip().split()))
|
|
|
|
m = int(input().rstrip())
|
|
|
|
if sum(req) <= m:
|
|
print(max(req))
|
|
return
|
|
|
|
now_ceil = m // n
|
|
now_asset = m
|
|
sorted_req = sorted(req)
|
|
idx = 0
|
|
|
|
while idx < n-1 and now_ceil >= sorted_req[idx]:
|
|
now_asset -= sorted_req[idx]
|
|
idx += 1
|
|
now_ceil = now_asset // (n-idx)
|
|
|
|
print(now_ceil)
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 1시간 10분
|
|
|
|
시간 복잡도: 내 풀이는 정렬할 때 O(nlogn)이고, n개의 요청예산을 보기 때문에 O(n)이라서 전체 시간복잡도는 O(nlogn)이다.
|
|
이분탐색 풀이의 경우는 0부터 max(req) 범위에서 찾기 때문에 log(max(req))이고, 매 mid마다 req 내용을 다 확인하므로
|
|
O(nlog(max(req)))이다.
|
|
문제에서는 req <= 10^5이고, n <= 10000이기 때문에 log로 치면 내가 더 빠르지만 이 조건이 바뀌는 것에 따라 달라질 것 같다.
|
|
|
|
해설: 요청 예산의 합이 m보다 작거나 같다면 그냥 다 주고 요청 예산 중 최대값을 출력하면 된다.
|
|
근데 아니라면 두 가지 풀이 방법이 있다.
|
|
먼저 내가 처음 푼 방식은 요청 예산들을 오름차순으로 정렬한 후 처음 상한액을 평균값으로 매긴다.
|
|
그 다음 한 곳씩 예산을 나눠주는데 이때 상한액 이하의 곳들은 나눠주고 남은 예산으로 남은 곳의 수를 나눠서 다시 평균값을 상한액으로 바꾼다.
|
|
이 과정을 반복하다가 현재 상한액보다 많은 곳을 요청한 곳이 있으면 앞으로 뒤에 있는 곳들도 요청한만큼 채워줄 수 없기 때문에
|
|
이번 상한액이 답이다.
|
|
|
|
근데 이분탐색으로 푸는 방법이 있음.
|
|
전체 요청 예산의 범위 중 상한액을 이분 탐색으로 찾아가는 것임.
|
|
한 점을 찾는 것이기 때문에 l <= r 조건에서 [mid]를 설정하고, n개의 요청 예산을 설정한 mid 기준으로 다 분배해본 후,
|
|
m 이하 중 최대값을 찾으면 된다.
|
|
s를 그때그때 결과라고 하면, 오름차순 정렬에서 s가 m 이하인 경우를 찾는 것이기 때문에 s <= m 이면 답이 될 수 있고,
|
|
오른쪽을 찾아봐야하기 때문에 l = mid라고 생각할 수 있지만, 이것은 들어갈 곳이 아닌 한 점을 찾는 것이기 때문에
|
|
l <= r을 한 이상 안 끝날 수도 있다. 따라서 mid는 따로 기록해두고, l = mid + 1, r= mid - 1로 해가며 찾아야한다.
|
|
""" |