문제 풀이
n, m = map(int,input().split())
tree = list(map(int,input().split()))
lt = 1
rt = max(tree)
res = 0
#자른 값과 남은 값이 큰 경우를... 이땐 남은 값이 더 큰 경우를 찾아야 하기에..lt를 증가!
while lt <= rt:
mid = (lt+rt)//2
s = 0
for i in tree:
if i >= mid:
s+= i-mid
if s >= m:
res = mid
lt = mid + 1
else:
rt = mid - 1
print(res)
- 최소한의 나무만 잘라서 원하는 값을 얻어가는 문제로 이분 탐색을 사용해 풀이가 가능하다.
- 이분 탐색은 구간을 정해 구간의 범위를 좁혀가며 해당 조건을 만족하는 값을 돌려주면 된다.
- 초기값 설정은 1 ~ 주어진 값의 최댓값을 사용하는 것이 일반적이므로 이 문제도 lt = 1 ~ rt = 주어진 값의 최대 값으로 설정했다.
- 문제를 풀때 주의해야 하는 점은 s값을 더해주는 과정인데 이는 해당 mid 값보다 작은 값은 벌목하지 않는다는 의미로 사용하면 안 되기때문에 if문으로 확인을 해주어야 했다.
- 이때 벌목해야 하는 나무는 필요한 만큼 최소화해야 하기 때문에 s가 위의 조건을 만족한다해도 더 큰 값들을 살펴보며 진행해야 한다.
'문제풀이 > 백준(Boj) 문제풀이' 카테고리의 다른 글
[백준][이분 탐색] - 10815. 숫자 카드 (0) | 2022.07.08 |
---|---|
[백준][이분 탐색] - 1654. 랜선 자르기 (0) | 2022.07.08 |
[백준][수학] - 24480. 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2022.05.19 |
[백준][수학] - 17496. 스타후르츠 (0) | 2022.05.02 |
[백준][그래프] - 2667. 단지번호붙이기 (0) | 2022.05.02 |