λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/leetcode

LeetCode 169 - Majority Element (Easy)

by HandHand 2023. 2. 5.

 

졜근 λͺ‡λ‹¬λ™μ•ˆ LeetCode λ¬Έμ œν’€μ΄λ₯Ό λͺ»ν–ˆλŠ”데,

μ˜¬ν•΄μ—λŠ” μž¬λ―Έμ™€ 성취감을 μœ„ν•΄ μ‹œκ°„ λ‚ λ•Œλ§ˆλ‹€ μ§¬λ‚΄μ„œ κ°„λ‹¨ν•œ 문제λ₯Ό ν•˜λ‚˜μ”© λ‹€μ‹œ ν’€μ–΄λ³΄λ €κ³ ν•©λ‹ˆλ‹€. πŸ˜„

 

πŸ’‘ 문제

LeetCode - 169번

 

🎯 풀이 κ³Όμ •

n 크기의 배열이 μ£Όμ–΄μ§ˆ λ•Œ, 과반수 μ΄μƒμ˜ μš”μ†Œλ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

ν•΄μ‹œλ§΅μ„ μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν• μˆ˜λ„ μžˆμ§€λ§Œ μ’€ 더 μ΅œμ ν™”λœ λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

μš”κ΅¬μ‘°κ±΄μ— μ˜ν•΄ 과반수λ₯Ό μ°¨μ§€ν•˜λŠ” μš”μ†Œκ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•œλ‹€λŠ” 것이 보μž₯되기 λ•Œλ¬Έμ—

보이어-무어 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜ 을 ν™œμš©ν•˜λ©΄ O(n) 의 μ‹œκ°„λ³΅μž‘λ„μ™€ O(1) 의 곡간 λ³΅μž‘λ„λ₯Ό κ°€μ§€λŠ” 풀이λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

이 μ•Œκ³ λ¦¬μ¦˜μ„ κ°„λ‹¨νžˆ ν’€μ–΄λ³΄μžλ©΄, 길이 n 을 κ°€μ§€λŠ” λ°°μ—΄ A μ—μ„œ 과반수λ₯Ό μ°¨μ§€ν•˜λŠ” μš”μ†Œ aκ°€ [n/2 + 1] 개 μžˆμ„ κ²½μš°μ—

λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ˜ 개수의 합은 [n - (n/2 + 1)] 이며 μ΄λŠ” μ ˆλŒ€ [n/2 + 1] 보닀 클 수 μ—†μŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ 이 점을 ν™œμš©ν•΄ major 와 count λ₯Ό λ³€μˆ˜λ‘œ 두고 배열을 μˆœνšŒν•˜λ©΄μ„œ

count κ°€ 0μΌλ•ŒλŠ” ν•΄λ‹Ή μš”μ†Œλ₯Ό major둜, 같은 μ’…λ₯˜μ˜ μš”μ†Œλ₯Ό λ°œκ²¬ν•˜λ©΄ +1, λ‹€λ₯΄λ‹€λ©΄ -1 을 ν•˜λ©΄

μ΅œμ’…μ μœΌλ‘œ λ‚¨μ•„μžˆλŠ” major κ°€ 과반 μ΄μƒμ˜ μš”μ†Œκ°€ λ©λ‹ˆλ‹€.

 

보닀 μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ λΈ”λ‘œκ·Έλ₯Ό μ°Έμ‘°ν•˜λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜

 

Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜

Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜(majority vote algorithm)[1]은 배열에 ν¬ν•¨λœ μ›μ†Œλ“€ 쀑 절반 이상 ν¬ν•¨λœ μ›μ†Œλ₯Ό linear time κ³Ό constant space 둜 찾을 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

sgc109.github.io

 

πŸ‘¨‍πŸ’» μ½”λ“œ

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    let major = null
    let count = 0

    for (let num of nums) {
        if (count === 0) {
            major = num
        }

        count += (major === num ? 1 : -1)
    }

    return major
};
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€