Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] section07 - 11 - ๋ฎค์ง๋น„๋””์˜ค(๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜)

YWTechIT 2021. 9. 14. 12:28
728x90

๐Ÿ“ section07 - 11 - ๋ฎค์ง๋น„๋””์˜ค(๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜)

์ด๋ถ„ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‘์šฉํ•ด์„œ ํ‘ธ๋Š” ๋ฌธ์ œ๋‹ค. ๋ณดํ†ต ์ด๋ถ„ํƒ์ƒ‰์„ ์ด์šฉํ•œ ๋ฌธ์ œ๋Š” ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ์„œ์น˜(Parametric Search) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ๊ฐ’์˜ ์ตœ๋Œ“๊ฐ’ ํ˜น์€ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜์—ฌ ๊ฒฐ์ •๋ฌธ์ œ๋กœ ๋ฐ”๊พธ์–ด ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋Š” ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ํฐ ์ƒํ™ฉ์—์„œ์˜ ํƒ์ƒ‰์„ ๊ฐ€์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ 20,000,000(์ด์ฒœ๋งŒ)์„ ๋„˜์–ด๊ฐ€๋ฉด ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด์ž. ๋ฒ”์œ„๊ฐ€ 10,000,000(์ฒœ๋งŒ) ์ด์ƒ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ์ด์ง„ ํƒ์ƒ‰์ฒ˜๋Ÿผ O(logN)์˜ ์†๋„๋ฅผ ๋‚ด์•ผ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋– ์˜ฌ๋ ค์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜์˜ ์ฃผ์š” ํŠน์ง•์€ ๋ฒ”์œ„ ๋‚ด์—์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์ด ์žˆ๋”๋ผ๋„ ๊ฑฐ๊ธฐ์„œ ๋๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ์ข‹์€ ์ตœ์ ์˜ ๋‹ต์ด ์žˆ๋Š”์ง€ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฏธ์„ธํ•œ ํŒ๐Ÿ’ก ์„ ๋งํ•˜์ž๋ฉด ์กฐ๊ฑด์„ ํ‘๋ฐฑ๋…ผ๋ฆฌ(?)๋กœ ๋– ์˜ฌ๋ฆฌ๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚˜์ด๊ฐ€ ์ž…๋ ฅ๋œ ๋ฐฐ์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๋•Œ 19์‚ด ๋ณด๋‹ค ํฌ์ง€๋งŒ 19์‚ด๊ณผ ์ œ์ผ ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ์„ ์ฐพ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋‹ค์Œ ์‚ฌ์ง„์ฒ˜๋Ÿผ ํ˜„์žฌ mid๊ฐ’์ด target๋ณด๋‹ค ์™ผ์ชฝ์— ์žˆ์œผ๋ฉด mid์˜ ์ขŒ์ธก์€ ๋‹ต์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜จ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— mid๋ฅผ ์šฐ์ธก์œผ๋กœ ์ด๋™ํ•˜์—ฌ ํƒ์ƒ‰์„ ๊ณ„์†ํ•˜๋‹ค ๋ณด๋ฉด ์ตœ์ ์˜ ๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ž, ์ด์ œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž.

 

๋ฌธ์ œ: DVD ๋…นํ™” ์‹œ์—๋Š” ์ˆœ์„œ๊ฐ€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค. 1๋ฒˆ ๋…ธ๋ž˜์™€ 5๋ฒˆ ๋…ธ๋ž˜๋ฅผ ๊ฐ™์€ DVD ์— ๋…นํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 1๋ฒˆ๊ณผ 5๋ฒˆ ์‚ฌ์ด์˜ ๋ชจ๋“  ๋…ธ๋ž˜๋„ ๊ฐ™์€ DVD์— ๋…นํ™”๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•œ ๋…ธ๋ž˜๋ฅผ ์ชผ๊ฐœ์„œ ๋‘ ๊ฐœ์˜ DVD๋กœ ๋…นํ™”ํ•  ์ˆ˜ ์—†๋‹ค. M๊ฐœ์˜ DVD์— ๋ชจ๋“  ๋™์˜์ƒ์„ ๋…นํ™”ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. DVD์˜ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œ๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. M๊ฐœ์˜ DVD๋Š” ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ์—ฌ์•ผ ์ œ์กฐ์›๊ฐ€๊ฐ€ ์ ๊ฒŒ ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ํ•˜์ž.

 

๋ฌธ์ œ์˜ ์„ค๋ช…์ด ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ๋ก ์ ์œผ๋กœ M๊ฐœ์˜ DVD์— ์Œ์•…์„ ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ๋‹ด์•„์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ๋‹ค. ์ตœ์ ์˜ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ถ„ ํƒ์ƒ‰์„ ์ด์šฉํ•œ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ lt๋Š” ์ฃผ์–ด์ง„ ๊ฐ’์˜ ์ œ์ผ ์ž‘์€ ๊ฐ’(1) ํ˜น์€ ์ œ์ผ ํฐ ๊ฐ’(9)์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, 1์€ ์ตœ์ ์˜ ๋‹ต๊ณผ ๊ทผ์ ‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ œ์ผ ํฐ ๊ฐ’์ธ 9๋ฅผ ์ฃผ์—ˆ๋‹ค. rt๋Š” arr์„ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์„ ์คฌ๋Š”๋ฐ, ์ด๋Š” ํ•œ DVD์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์Œ์•…์˜ ํฌ๊ธฐ๋ฅผ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์ด๋‹ค. ํ˜น์€ ๋ถ€๋ฅธ ๊ณก์˜ ๊ธธ์ด๊ฐ€ 10,000๋ถ„ ์ดํ•˜์ด๋ฏ€๋กœ ์ตœ๋Œ€๋กœ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ธ n*10000์„ ์ค˜๋„ ๋œ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ฝ์€ ๋‚ด์šฉ์ด ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ์˜ ํ’€์ด๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.

 

 

728x90
let n = 9;
let m = 3;
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

console.log(solution(n, m, arr));
// let rt = n * 10_000;

function solution(n, m, arr){
    let lt = Math.max(...arr);
    let rt = 45;
    let answer;

    while (lt<=rt){
        let mid = Math.floor((lt+rt)/2);
        console.log(`lt=${lt}, rt=${rt}, mid=${mid}`)
        let cnt=1;
        let sum=0;

        for (let x of arr){
            if(sum+x>mid){
                cnt++;
                sum=x;
            }else sum+=x;
        }

        if (cnt <= m) answer=mid, rt=mid-1;
        else lt=mid+1;
    }
    console.log(answer)
}
๋ฐ˜์‘ํ˜•