[Python] 백준 2805: 나무 자르기(이분탐색)
접근법
start
를 0으로 설정하고 trees
에서 가장 높은 나무를 max()
함수로 찾아 end
로 설정한다.
for문으로 trees
에 있는 나무들을 하나씩 꺼내며 mid
값과 비교하며 자른다(cut_tree
에 저장).
만약 나무가 M
보다 많이 잘렸다면(if cut_tree >= M
) mid
값을 키운다.
"""이분탐색"""
from sys import stdin
N, M = map(int, stdin.readline().split()) # N = 나무 수, M = 집으로 가져갈 나무 길이
trees = list(map(int, stdin.readline().split()))
start, end = 0, max(trees) # 이분탐색용 왼쪽 오른쪽 설정
while start <= end:
mid = (start+end)//2
cut_tree = 0 # 잘린 나무 합을 저장하기 위한 변수
for i in trees:
if i > mid: # mid보다 큰 높이의 나무는 잘림
cut_tree += i - mid
if cut_tree >= M: # 원하는 나무 높이보다 더 많이 잘렸다면 start에 mid+1 입력
start = mid + 1
else: # 원하는 나무 높이보다 덜 잘렸다면 end에 mid-1 입력
end = mid - 1
print(end)
과제
CPython의 경우 시간초과로 실패가 뜬다. 개선하는 방법을 공부해야겠다.
Author And Source
이 문제에 관하여([Python] 백준 2805: 나무 자르기(이분탐색)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@binsu/Python-백준-2805-나무-자르기이분탐색저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)