티스토리 뷰

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

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

www.acmicpc.net

 

 

👩‍💻문제 이해

항상 그렇듯 이분탐색 알고리즘에서는 무엇을 변수로 둘지와 조건을 어떻게 줄지가 가장 중요하다.

(조건)

위 문제에서는 가지고 가려 하는 나무의 길이가 M으로 정해져 있기 때문에 이걸 조건으로 두면 된다.

즉, 주어진 배열 각각의 원소들을 구하고자 하는 값(target)으로 뺀 값의 합이 M이 되는 것이 조건이다.

그리고 이 때 절단기 높이의 최댓값을 구해야 하기 때문에 end값을 출력해주면 된다.

(변수)

변수가 의미하는게 뭔지 정확히 알고 있어야 한다.

우선 이 문제에서 변수는 절단기의 높이이다. 

그 다음으로 start와 end를 무엇으로 둘지 정하는 것이 이분탐색 알고리즘의 시작이다.

start는 절단기 높이의 최소값인 1로 두고, end는 배열의 최대값으로 둔다. 

 

 

 

👩‍💻반복문을 사용해 이분탐색 알고리즘 구현 (함수 별도 구현)  : 성공🌈

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

def binary(arr, m):
  start = 1
  end = max(arr)
  
  while start <= end:
    mid = (start + end) // 2
    cnt = 0

    for i in arr:
      if i - mid > 0:
        cnt += (i - mid)   
        
    if cnt == m:
      return mid

    elif cnt <= m:
      end = mid - 1
      
    else:
      start = mid + 1
  return end
    
print(binary(li, m))
댓글
최근에 올라온 글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday