하루 알고리즘(JS)

[바미] 나무 자르기

Bami 2024. 7. 20. 09:11
728x90
반응형

문제

 

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

코드

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

const [N, M] = input[0].split(' ').map(Number);
const trees = input[1].split(' ').map(Number);

function getMaxSawHeight(N, M, trees) {
    let low = 0;
    let high = Math.max(...trees);
    let result = 0;

    while (low <= high) {
        const mid = Math.floor((low + high) / 2);
        const totalWood = trees.reduce((acc, height) => {
            if (height > mid) {
                return acc + (height - mid);
            } else {
                return acc;
            }
        }, 0);

        if (totalWood >= M) {
            result = mid;
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    return result;
}

const maxHeight = getMaxSawHeight(N, M, trees);
console.log(maxHeight);

문제 해설

이 문제는 이진 탐색(Binary Search)을 활용하여 최적의 절단기 높이를 찾는 전형적인 문제입니다.

나무의 높이 값을 조정하면서 필요한 나무의 길이를 얻을 수 있는 최적의 절단기 높이를 찾아야 하죠.

 

그래서 최적의 절단기 높이를 찾는 과정은 아래와 같습니다.

 

절단기 높이를 이진 탐색을 통해 결정되는데 가능한 최소 높이(low)는 0, 최대 높이(high)는 가장 긴 나무의 높이로 설정합니다.
그 후 중간 높이(mid)를 계산하여 그 높이로 나무를 잘랐을 때 얻을 수 있는 나무 길이를 계산합니다.

이 때 얻은 나무 길이가 필요 나무 길이 M보다 크거나 같다면 더 높은 높이로 시도해보고, 그렇지 않다면 더 낮은 높이로 다시 시도합니다.


이 과정을 반복하며 최적의 높이를 찾도록 풀었습니다.

 

시간 복잡도

시간 복잡도는 알고리즘이 입력의 크기에 따라 얼마나 빠르게 실행되는지를 나타냅니다

 

이진 탐색의 시간 복잡도는 𝑂(log⁡ 𝐻)이며, 각 단계에서 모든 나무 높이를 합산하는 데 𝑂(𝑁)이 소요됩니다.

따라서 전체 시간 복잡도는 𝑂(𝑁 log⁡ 𝐻)이 됩니다. 여기서 𝐻는 가장 높은 나무의 높이를 의미하죠.

공간 복잡도

공간 복잡도는 알고리즘이 얼마나 많은 메모리 공간을 사용하는지 나타냅니다.

 

공간 복잡도는 입력 데이터와 해시셋을 저장하는 데 필요한 입니다.

이진 탐색 과정에서 추가적인 메모리가 거의 필요하지 않기 때문에 전체 공간 복잡도는 니다.

728x90
반응형