Coding Test/Codility

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

chamroro 2025. 3. 2. 16:15

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

์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด 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;
}
๋ฐ˜์‘ํ˜•