백준 2805 | 이진탐색 | 나무 자르기 [파이썬 python]

2023. 4. 26. 15:38·Algorithm/백준
 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net

 

코드

n, m = map(int, input().split())
tree = list(map(int, input().split()))

# 이진 탐색을 위한 시작점, 끝점
start = 0
end = max(tree)

result = 0 # 최종 절단기 높이
while(start <= end):
    total = 0 # 가져갈 나무의 길이
    mid = (start + end) // 2 # 절단기 높이
    for i in tree:
        if i > mid: # 절단기보다 주어진 나무가 길면 자른 나머지를 total에 추가
            total += i - mid
            
    # 이진 탐색        
    if total < m: # 가져가야 하는 길이 m보다 작은 길이이면
        end = mid - 1 # mid 기준 왼쪽 부분 탐색
    else: # 가져가야 하는 길이 m보다 크거나 같으면
        result = mid # 절단기 높이를 mid로 설정
        start = mid + 1 # mid 기준 오른쪽 부분 탐색

print(result)

 

최소 M을 가져갈 수 있는 최대 절단기의 높이 result를 구해야 한다.

여기서 이진 탐색은 가져갈 나무의 길이(total)가 M이 되는 경우를 찾아야 하기 때문에 total에 대해 실행한다.

 

total은 주어진 나무를 절단기(mid)로 잘랐을 때 남는 길이가 된다.

그러므로 tree의 모든 요소를 절단기(mid)로 잘랐을 때 남는 길이인 i-mid를 total에 누적시킨다. 

 

이렇게 구해진 total을 가지고 이진탐색을 수행한다.

가져가야 하는 길이인 M과 비교해, total < M이면 M 기준으로 왼쪽 부분을 탐색해야 하므로 end를 mid-1로 바꿔 이진탐색을 계속 진행한다.

반대로, total > M이면 M 기준으로 오른쪽 부분을 탐색해야 하므로 start를 mid+1로 바꿔 이진탐색을 계속 진행한다.

 

 

 

저작자표시 (새창열림)
'Algorithm/백준' 카테고리의 다른 글
  • 백준 2810 | 그리디 | 컵홀더 [파이썬 python]
  • 백준 4796 | 그리디 | 캠핑 [파이썬 python]
  • 백준 1920 | 이진탐색 | 수 찾기 [파이썬 python]
  • 백준 24444 | BFS | 너비 우선 탐색 1 [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (245)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (46)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
백준 2805 | 이진탐색 | 나무 자르기 [파이썬 python]
상단으로

티스토리툴바