매일 BOJ

(매일 BOJ) C++ 2805번 나무 자르기

norepinephrine 2025. 7. 25. 15:49

이번 문제는 2805번 나무 자르기 이다.

접근법

이 문제는 이분 탐색을 사용해서 가장 높이 자를 수 있는 지점을 찾아내는 문제이다. 이분 탐색과 관련된 자세한 설명을 보고 싶으면 아래 글을 참고할 수 있다.

2025.07.25 - [매일 BOJ] - (매일 BOJ) C++ 2512번 예산

 

(매일 BOJ) C++ 2512번 예산

이번 문제는 2512번 예산 문제이다.접근법이 문제의 알고리즘 분류를 까보면 이분탐색 활용해야 한다고 작성되어 있다. 따라서start 값은 1,end 값은 예산 요청에서 가장 큰 값으로 설정한 후 for문

norepinephrine.tistory.com

 

작성코드

# include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0); cin.tie(0);
    int N,M; // N 나무의 수 / M 가져갈 나무의 길이
    cin >> N >> M;
    vector<int> v; // 각 나무의 높이 배열
    for (int i = 0; i < N; i++) // 각 나무의 높이 input
    {
        int hight;
        cin >> hight;
        v.push_back(hight);
    }

    sort(v.begin(),v.end()); // 이분탐색용 정렬
    int start = 0;
    int end = v.back();
    int result = 0;

    while (start <= end){
        int mid = (start + end) / 2;
        long long sum = 0;
        for (int i = 0; i < v.size(); i++){
            if (v[i] > mid) sum += (v[i] - mid);
        }

        if (M <= sum) {
            if(mid <= end) result = mid;
            start = mid + 1; // sum 값이 더 크다면 더 높이 자를 수 있음 > start 값 증가
        }
        else{
            end = mid - 1; // sum  값이 더 작으면 mid 보다 작은 범위에서 탐색
        }


    }
    cout << result;


}