알고리즘 문제 풀이/Javascript

[node.js] 백준 16401 과자 나눠주기

맛대 2025. 2. 4. 10:17

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

로직

  • 이분탐색 활용
  • 과자를 사용하지 않아도 됨 => 최대값(end)을 과자 최소 크기로 설정하면 안됨
    • 생각해보니 end값을 Math.max(...arr)해서 (big O = N)의 연산으로 end값을 줄이고 시작하는게 좋겠다는 생각이 들어 수정
// logic
const solution = (M,N,arr)=>{
    const check = (M,value,arr)=>{
        let cnt = 0;
        for (const len of arr){
            cnt += Math.floor((len)/value);
            if (cnt>=M) return true;
        }
        return false;
    }

    arr.sort((a,b)=>b-a)
    let [s,e] = [0,Math.max(...arr)];
    let ans = 0;
    while (s<=e) {
        const mid = Math.floor((s+e)/2);
        if (check(M,mid,arr)) {
            ans = mid;
            s = mid+1;
        } else e = mid-1;
    }
    return ans;
}

// IO
let M,N,arr;
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.on('line',(line)=>{
    M===undefined? [M,N] = line.split(' ').map(Number): arr = line.split(' ').map(Number);
    if (arr !== undefined) rl.close();
});
rl.on('close',()=>{
    const ans = solution(M,N,arr);
    console.log(ans);
});

후기

  • 몫을 구하기 위해서 Math.floor를 쓰는게 익숙하지 않다
  • 전에는 반복문 종료 조건에 대해 안떠올랐다. 오랜만에 문제를 풀며 원리를 생각하니 자연스럽게 떠올랐다.