Coding Test/Codility

8. 리더 (Leader) Codility Lesson ν•œκ΅­μ–΄ 정리본 (JavaScript ver.)

chamroro 2025. 3. 1. 23:31

리더(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) (각 μ›μ†Œλ₯Ό ν•œ λ²ˆμ”©λ§Œ 탐색)

λ°˜μ‘ν˜•