8. ๋ฆฌ๋” (Leader) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ๋ฆฌ๋”(Leader)๋ž€?

    ์ฃผ์–ด์ง„ ์ˆ˜์—ด A = [aโ‚€, aโ‚, ..., aโ‚™โ‚‹โ‚] ์—์„œ ๋ฆฌ๋”(Leader) ๋Š” ์ˆ˜์—ด์˜ ์›์†Œ ์ค‘ ์ ˆ๋ฐ˜์„ ์ดˆ๊ณผํ•˜์—ฌ ๋“ฑ์žฅํ•˜๋Š” ์›์†Œ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

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

    A = [6, 8, 4, 6, 8, 6, 6];
    

    ์œ„ ์ˆ˜์—ด์—์„œ 6์€ 4๋ฒˆ ๋“ฑ์žฅํ•˜์—ฌ n/2 = 3.5 ๋ณด๋‹ค ๋งŽ์ด ๋“ฑ์žฅํ•˜๋ฏ€๋กœ ๋ฆฌ๋”๊ฐ€ ๋œ๋‹ค. ๋ฆฌ๋”๋Š” ์ตœ๋Œ€ ํ•˜๋‚˜๋งŒ ์กด์žฌ ํ•œ๋‹ค.


    1. O(n²) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•

    ๊ฐ ์›์†Œ์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์„ธ์–ด ๋ฆฌ๋”๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function slowLeader(A) {
        let n = A.length;
        let leader = -1;
        
        for (let k = 0; k < n; k++) {
            let candidate = A[k];
            let count = 0;
            for (let i = 0; i < n; i++) {
                if (A[i] === candidate) {
                    count++;
                }
            }
            if (count > Math.floor(n / 2)) {
                leader = candidate;
            }
        }
        return leader;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n²) (๋ชจ๋“  ์›์†Œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋น„๊ต)


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

    ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋ฉด ๊ฐ™์€ ๊ฐ’๋“ค์ด ์ธ์ ‘ํ•˜๊ฒŒ ๋ชจ์ด๋ฏ€๋กœ, ์ค‘์•™๊ฐ’(A[n/2])์ด ๋ฆฌ๋”์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function fastLeader(A) {
        let n = A.length;
        A.sort((a, b) => a - b);
        let candidate = A[Math.floor(n / 2)];
        let count = A.filter(x => x === candidate).length;
        
        return count > Math.floor(n / 2) ? candidate : -1;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n) (์ •๋ ฌ ํ›„ ๋‹จ์ˆœ ๋ฐ˜๋ณต)


    3. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์Šคํƒ ๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ•

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

    • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๋ฆฌ๋”๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์Šคํƒ์„ ํ™œ์šฉํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋‚จ์€ ์›์†Œ๋ฅผ ๋ฆฌ๋” ํ›„๋ณด๋กœ ์„ ํƒํ•œ๋‹ค.
    • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฆฌ๋” ํ›„๋ณด์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์„ธ์–ด ์‹ค์ œ ๋ฆฌ๋”์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function goldenLeader(A) {
        let n = A.length;
        let size = 0;
        let value;
        
        for (let k = 0; k < n; k++) {
            if (size === 0) {
                size++;
                value = A[k];
            } else {
                size += (A[k] === value) ? 1 : -1;
            }
        }
        
        let candidate = -1;
        if (size > 0) {
            candidate = value;
        }
        
        let count = A.filter(x => x === candidate).length;
        return count > Math.floor(n / 2) ? candidate : -1;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (๊ฐ ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ํƒ์ƒ‰)

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€