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 Algorithm | O(n) | O(1) |
์์ฝ ๐ โ
- ์ ๋ ฅ ๋ฐฐ์ด์ ํ ๋ฒ๋ง ์ํํ๋ฉด์ ํจ์จ์ ์ผ๋ก ๊ณผ๋ฐ์ ์์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
- ๊ณต๊ฐ ๋ฒ์ถ๋ ์ต์ ํ๋ฅผ ์ํ๋ฉด Boyer-Moore ์๊ณ ๋ฆฌ์ฆ์ด ์ต์ ์ ์ ํ์ ๋๋ค!