9. ์ตœ๋Œ€ ์Šฌ๋ผ์ด์Šค ๋ฌธ์ œ (Maximum Slice Problem) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ์ตœ๋Œ€ ์Šฌ๋ผ์ด์Šค ๋ฌธ์ œ๋ž€?

    ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด A = [aโ‚€, aโ‚, ..., aโ‚™โ‚‹โ‚] ์—์„œ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด(์Šฌ๋ผ์ด์Šค, Slice) ์ค‘ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ตฌ๊ฐ„์„ ์ฐพ๋Š” ๋ฌธ์ œ ์ด๋‹ค. ์ฆ‰, ๋‘ ์ธ๋ฑ์Šค p, q (p ≤ q)๋ฅผ ์„ ํƒํ•˜์—ฌ A[p] + A[p+1] + ... + A[q] ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ๋ฅผ ์ฐพ๋Š”๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ:

    A = [5, -7, 3, 5, -2, 4, -1];
    

    ์œ„ ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ€ ํ•ฉ์„ ๊ฐ–๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์€ [3, 5, -2, 4]์ด๋ฉฐ, ํ•ฉ์€ 10์ด๋‹ค.


    1. O(n³) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•

    ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์Šฌ๋ผ์ด์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function slowMaxSlice(A) {
        let n = A.length;
        let result = 0;
        
        for (let p = 0; p < n; p++) {
            for (let q = p; q < n; q++) {
                let sum = 0;
                for (let i = p; i <= q; i++) {
                    sum += A[i];
                }
                result = Math.max(result, sum);
            }
        }
        return result;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n³) (๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ฐ˜๋ณต ํƒ์ƒ‰)


    2. O(n²) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๊ฐœ์„ ๋œ ๋ฐฉ๋ฒ•

    ๋ˆ„์  ํ•ฉ(Prefix Sums)์„ ์ด์šฉํ•˜๋ฉด O(n²) ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function quadraticMaxSlice(A) {
        let n = A.length;
        let result = 0;
        
        for (let p = 0; p < n; p++) {
            let sum = 0;
            for (let q = p; q < n; q++) {
                sum += A[q];
                result = Math.max(result, sum);
            }
        }
        return result;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n²) (๋ถ€๋ถ„ํ•ฉ์„ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ ์ œ๊ฑฐ)


    3. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์ตœ์ ํ™”๋œ ๋ฐฉ๋ฒ• (์นด๋ฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

    ์•„์ด๋””์–ด:

    • maxEnding ๋ณ€์ˆ˜์— ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ข…๋ฃŒ ๋ถ€๋ถ„ํ•ฉ ์„ ์ €์žฅ.
    • ๋‹ค์Œ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ, maxEnding ์ด ์–‘์ˆ˜์ด๋ฉด ๊ทธ๋Œ€๋กœ ๋”ํ•˜๊ณ , ์Œ์ˆ˜์ด๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”.
    • ์ „์ฒด ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ maxEnding ๊ฐ’์„ ๋ฐ˜ํ™˜.

    JavaScript ์ฝ”๋“œ:

    function goldenMaxSlice(A) {
        let maxEnding = 0;
        let maxSlice = 0;
        
        for (let a of A) {
            maxEnding = Math.max(0, maxEnding + a);
            maxSlice = Math.max(maxSlice, maxEnding);
        }
        
        return maxSlice;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (ํ•œ ๋ฒˆ์˜ ๋ฃจํ”„๋งŒ ์ˆ˜ํ–‰)

     

     

    ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ชจ๋“  ๋ฐฐ์—ด์˜ ๊ฐ’์ด ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ, ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋Š” 

    function goldenMaxSlice(A) {
        let maxEnding = A[0];
        let maxSlice = A[0];
        
        for (let i = 1; i < A.length; i++) {
            // Either start a new slice at A[i] or continue the previous one
            maxEnding = Math.max(A[i], maxEnding + A[i]);
            maxSlice = Math.max(maxSlice, maxEnding);
        }
        
        return maxSlice;
    }
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€