Skip to content

Majority Element (LeetCode 169) โ€‹

๋ฌธ์ œ ๋งํฌ โ†’ LeetCode 169. Majority Element


๋ฌธ์ œ ์„ค๋ช… โ€‹

์ •์ˆ˜ ๋ฒ”์œ„ nums๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ๋ฐฐ์—ด ๋‚ด์—์„œ **๊ณผ๋ฐ˜์ˆ˜(> n/2๋ฒˆ ๋“ฑ์žฅ)**ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ ์กฐ๊ฑด์ƒ, ๊ณผ๋ฐ˜์ˆ˜ ์š”์†Œ๋Š” ๋ฒ”๋‹ต์‹œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


์ž…๋ ฅ โ€‹

  • nums: ์ •์ˆ˜ ๋ฐฐ์—ด (length โ‰ฅ 1)

์ถœ๋ ฅ โ€‹

  • ๋ฐฐ์—ด์—์„œ ๊ณผ๋ฐ˜์ˆ˜๋กœ ๋“ฑ์žฅํ•˜๋Š” ์ •์ˆ˜

์ ‘๊ทผ ๋ฐฉ๋ฒ• โœ๏ธ โ€‹

1๏ธโƒฃ Map ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ โ€‹

  • ๊ฐ ์ˆซ์ž์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ Map์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค ๊ณผ๋ฐ˜์ˆ˜ ์กฐ๊ฑด์„ ์ฆ‰์‹œ ๊ฒ€์ฆํ•ด์„œ, ์กฐ๊ฑด ์ถฉ์ถœ ์‹œ ๋ฐ”๋กœ ๋ฐ˜ํ™˜.

2๏ธโƒฃ Boyer-Moore Voting Algorithm โ€‹

  • ๊ณต๊ฐ„ ๋ฒ”์ถ”๋„๋ฅผ **O(1)**๋กœ ์ค„์ธ ๋ฐฉ๋ฒ•.
  • ํ•˜๋‚˜์˜ ํ˜ธ๋ถ€์™€ ์นด์šดํŠธ๋งŒ ์‚ฌ์šฉํ•ด์„œ, ๋‹ค๋ฅธ ์›์†Œ์™€ ์ƒ์‚ฌ(pairing)ํ•˜๋ฉฐ ๊ณผ๋ฐ˜์ˆ˜ ์›์†Œ๋ฅผ ์ฐพ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

ํ’€์ด ์ฝ”๋“œ ํ•˜๋‚˜๋‚˜ ๋ณด๊ธฐ ๐Ÿ‘‡ โ€‹

โœ… 1. Map ์‚ฌ์šฉ ๋ฐฉ๋ฒ• โ€‹

typescript
function majorityElement(nums: number[]): number {
  const halfLen = nums.length / 2
  const map = new Map<number, number>()

  for (const num of nums) {
    // ํ˜„์žฌ ์ˆซ์ž์˜ count๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์—†์œผ๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    const cnt = (map.get(num) ?? 0) + 1
    map.set(num, cnt)

    // ๊ณผ๋ฐ˜์ˆ˜ ์กฐ๊ฑด ์ถฉ์ถœ ์‹œ ์ฆ‰์‹œ ๋ฐ˜ํ™˜
    if (cnt > halfLen) return num
  }

  // ๋ฌธ์ œ ์กฐ๊ฑด์ƒ majority element๋Š” ๋ฒ”๋‹ต์‹œ ์กด์žฌ
  throw new Error('No majority element found')
}
  • ์‹œ๊ฐ„ ๋ฒ”์ถ”๋„: O(n)
  • ๊ณต๊ฐ„ ๋ฒ”์ถ”๋„: O(n)

โœ… 2. Boyer-Moore Voting Algorithm โ€‹

typescript
function majorityElement(nums: number[]): number {
  let candidate = nums[0] // ์ดˆ๊ธฐ ํ˜ธ๋ถ€
  let count = 1 // ํ˜ธ๋ถ€์˜ ์นด์šดํŠธ

  for (let i = 1; i < nums.length; i++) {
    if (count === 0) {
      // ์นด์šดํŠธ๊ฐ€ 0์ด๋ฉด ํ˜ธ๋ถ€ ๊ฐฑ์ฒด
      candidate = nums[i]
      count = 1
    } else if (nums[i] === candidate) {
      // ํ˜ธ๋ถ€์™€ ๊ฐ™์€ ์ˆซ์ž โ†’ count ์ฆ๊ฐ€
      count++
    } else {
      // ํ˜ธ๋ถ€์™€ ๋‹ค๋ฅธ ์ˆซ์ž โ†’ count ๊ฐ์†Œ
      count--
    }
  }

  return candidate
}
  • ์‹œ๊ฐ„ ๋ฒ”์ถ”๋„: O(n)
  • ๊ณต๊ฐ„ ๋ฒ”์ถ”๋„: O(1)

์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ฒ”์ถ”๋„ ๋น„๊ต โœจ โ€‹

๋ฐฉ๋ฒ•์‹œ๊ฐ„ ๋ฒ”์ถ”๋„๊ณต๊ฐ„ ๋ฒ”์ถ”๋„
Map ์‚ฌ์šฉO(n)O(n)
Boyer-Moore Voting AlgorithmO(n)O(1)

์š”์•ฝ ๐ŸŒŸ โ€‹

  • ์ž…๋ ฅ ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๋ฉด์„œ ํšจ์œจ์ ์œผ๋กœ ๊ณผ๋ฐ˜์ˆ˜ ์›์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ฐ„ ๋ฒ”์ถ”๋„ ์ตœ์ ํ™”๋ฅผ ์›ํ•˜๋ฉด Boyer-Moore ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ตœ์ ์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค!