import sys
count, length_required = map(int, input().split())
trees = list(map(int, sys.stdin.readline().split()))
trees.sort()
# 가운데 나무를 기준으로 시작
mid_index = count // 2
cutter = trees[mid_index]
height = 0
while True:
height = 0
for tree in trees:
n = tree - cutter
if n >= 0:
height += n
# 만약 절단된 나무가 요구된 길이보다 짧다면 절단 높이를 낯줘준다.
if height < length_required:
cutter -= 1
# 만약 절단된 나무가 요구된 길이보다 길다면 절단 높이를 높혀준다.
elif height > length_required:
cutter += 1
# 절단된 나무길이와 요구된 나무길이가 동일할 때 까지 반복한다.
if height == length_required:
break
print(cutter)
1차 풀이는 선형 탐색을 이용해서 풀었다. 절단된 나무 길이와 절단기 위치를 비교해가며
둘의 값이 동일해질 때까지 절단기의 위치를 1씩 조절해갔다.
결과적으로 시간복잡도가 높아 '시간초과'가 걸려 통과하지 못했다.
애초에 이분탐색문제를 선형탐색으로 진행했으니 당연한 결과이긴하지..
import sys
count, length_required = map(int, input().split())
trees = list(map(int, sys.stdin.readline().split()))
start = 0
end = max(trees)
# '시간초과'를 방지하기 위해 while문에 포함하지않고 함수를 따로 빼놓음
# 절단기 높이 구하는 함수
def tree_height(cutter):
height = 0
for tree in trees:
if tree - cutter > 0:
height += (tree - cutter)
return height
while start <= end:
cutter = (start + end) // 2
height = tree_height(cutter)
print(f'start: {start}, end: {end}, cutter: {cutter}, height: {height}', 'test')
# 만약 절단된 나무가 요구된 길이보다 짧다면 절단기를 놓을 범위를 낮춰준다.
if height < length_required:
end = cutter - 1
# 만약 절단된 나무가 요구된 길이보다 길다면 절단기을 놓을 범위를 늘려준다.
elif height >= length_required:
answer = cutter
start = cutter + 1
# 절단된 나무길이와 요구된 나무길이가 동일할 때 까지 반복한다.
if height == length_required:
break
print(answer)
2차 풀이로는 이진 탐색을 사용했다. input값을 받는 부분부터 while문까지 전체적인 틀은
1차 풀이와 비슷하지만 절단기의 위치를 1씩 변경하는 것이 아닌 범위
자체를 변경하여
위치를 찾을 수 있도록 진행하였다. 탐색하는 횟수가 확실히 줄어드니 시간복잡도도 낮아져
시간초과 없이 통과할 수 있었다.