Algorithm

백준 2512번 : 예산

jun_code 2022. 2. 12. 23:20

<문제>

링크 : https://www.acmicpc.net/problem/2512

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net


<코드>

import sys
input = sys.stdin.readline

N = int(input())
bud = list(map(int, input().split()))
M = int(input())
s, e = 0, max(bud)

while e-s >= 0:
    mid = (s+e)//2
    res = 0
    for i in range(N):
        if bud[i] >= mid:
            res += mid
        else:
            res += bud[i]
    if res > M:
        e = mid-1
    else:
        s = mid+1
print(e)
import sys
input = sys.stdin.readline

N = int(input())
bud = list(map(int, input().split()))
M = int(input())
s, e = 0, max(bud)

while e-s >= 0:
    mid = (s+e)//2
    res = 0
    for i in bud:
        res += min(mid, i)
    if res > M:
        e = mid-1
    else:
        s = mid+1
print(e)

<풀이>

  • 예산을 입력받아 이분탐색을 위해 최소값 0과 최대값을 변수로 만든다.
  • 최소값과 최대값이 동일할때까지 반복하여 mid값에 따른 배정될 예산을 계산한다.
  • 배정된 예산보다 총 예산인 큰 경우 mid값을 작게햐야하므로 최대값 = mid-1, 그 반대인 경우 최소값 = mid +1로 설정한다.

 

  • 배정한 예산보다 총 예산이 큰 경우 최대값을 mid -1, 반대인 경우 최소값을 mid+1로 설정해야 한다.
  • Index로 생각할 때, 이분탐색의 경우 mid +/- 1을 해 주어야 하는 경우와 동일하게 수치인 경우도 계산을 위해 필요한 작업임

 


참고 : https://github.com/Junuux/Algorithm/tree/main/Silver/2512

 

GitHub - Junuux/Algorithm

Contribute to Junuux/Algorithm development by creating an account on GitHub.

github.com