나무의 개수는 N, 상근이가 가지고 가려는 나무의 길이는 M, prev_gap = 100
일단 1부터 나무들의 높이의 최댓값까지를 반복문 돌린다.
만약, 1일 때
나무를 자름
여기서도 나무의 개수만큼 반복문을 돌린다. (20 15 10 17)
첫 번째 나무 - 1 -> 19
두 번째 나무 -1 -> 14
세 번째 나무 -1 -> 9
네 번째 나무 -1 -> 16
=> 19 + 14 + 9 + 16 만큼의 나무를 얻음
=> 만약, 얻은 나무의 길이-M이 0보다 크고 prev_gap보다 작다면 갱신해줌
-> 나무가 제일 작게 남을 때를 구하는 줄 알고 했던 접근 방식
나무의 개수는 N, 상근이가 가지고 가려는 나무의 길이는 M
일단 나무들의 높이에서 0까지를 반복문 돌린다. (20 15 10 17)
만약, 20일 때 / 나무의 높이가 20보다 큰 지 작은 지 비교
첫 번째 나무 - 20 -> 0
두 번째 나무(작음)
세 번째 나무 (작음)
네 번째 나무 (작음)
=> 0m
만약, 나온 길이가 M보다 길다면 return
N, M = list(map(int, input().split()))
tree_length_list = list(map(int, input().split()))
for i in range(max(tree_length_list)):
sum_length = 0
for tree_length in tree_length_list:
if(tree_length > max(tree_length_list)-i):
sum_length += tree_length-(max(tree_length_list)-i)
if(sum_length >= M):
answer = max(tree_length_list) -i
break
print(answer)
-> 시간초과
min과 max의 중간값으로 설정한다.(10)
10일 때, 만약, 나무 높이가 중간값보다 크면? 10, 5, 0, 7 -> 22
만약 7을 바로 찾았다면, return mid
22개가 7보다 크다면?
min을 10으로 저장,
min과 max의 중간 값으로 감
15일 때, 만약 중간값이 나무 높이보다 크다면? 5, 1 -> 6
6이 7보다 작다면?
max를 15로 저장,
min과 max의 중간 값으로 감
13일 때, 7, 2, 3 -> 12 큼
min을 13으로 저장
14일 때, 6, 1, 2 -> 9 큼
min을 14로 저장
If(min==max): return min
N, M = list(map(int, input().split()))
tree_length_list = list(map(int, input().split()))
min = 0
max = max(tree_length_list)
while(min<=max):
mid = round((min+max)/2)
sum_length = 0
for tree_length in tree_length_list:
if(tree_length > mid):
sum_length += tree_length-mid
if(sum_length==M):
break
elif(sum_length>M):
min = mid
elif(sum_length<M):
max = mid
else:
break
print(mid)
-> 또 시간초과 .. 왜?
-> sys가 아니라 input() 써서 그런가? -> 시간초과
-> if문들 순서를 바꾸어줘야 하나? -> 시간 초과
아무리 생각해도 모르겠다...
import sys
N, M = list(map(int, sys.stdin.readline().split()))
tree_length_list = list(map(int, sys.stdin.readline().split()))
min = 0
max = max(tree_length_list)
while(min<=max):
mid = (max + min) // 2
sum_length = 0
for tree_length in tree_length_list:
if(tree_length > mid):
sum_length += tree_length-mid
if(sum_length>=M):
min = mid + 1
else:
max = mid - 1
print(mid)
-> 성공 뜨는데 도대체 뭐가 다른 거지!!
**
import sys
N, M = list(map(int, sys.stdin.readline().split()))
tree_length_list = list(map(int, sys.stdin.readline().split()))
min = 0
max = max(tree_length_list)
while(min<=max):
mid = (max + min) // 2
sum_length = 0
for tree_length in tree_length_list:
if(tree_length > mid):
sum_length += tree_length-mid
if(sum_length>=M):
min = mid
else:
max = mid
print(mid)