Leetcode - Majority Element
์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถ
๋ฌธ์ ๋ ํด์ํ๋ฉด ๊ณผ๋ฐ์ ์ด์ ๋ฑ์ฅํ ์์๋ฅผ ๋ฆฌํดํ๋ฉด ๋๋ค. ์ด๋ฒ ๋ฌธ์ ๋ ์ด 3๊ฐ์ ์๋ฃจ์ ์ด ์ ๊ณต๋๋ค.
๐ Naive Solution
์ญ์ ์ฒ์์๋ ๊ฐ์ฅ ์์ด์ ์ธ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๋์ ๋๋ฆฌ๋ฅผ ํ๋ ๋ง๋ค์ด์ ๋ฑ์ฅ ํ์๋ฅผ ๋ชจ๋ ์ ์ฅํด๋๊ณ ๊ทธ ๋ฑ์ฅ ํ์๋ฅผ ์ ๋ ฌํ๋ฉด ์ข์ ๊ฑฐ ๊ฐ๋ค. (์ฌ์ค ๋ณ๋ก์)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# Naive Solutions
num_cnt = dict()
for num in nums:
num_cnt[num] = num_cnt.get(num, 0)+1
num_cnt = sorted(num_cnt.items(), key=lambda x:-x[1])
ret = num_cnt[0][0]
return ret
์ฝ๋๋ ๋ง ๊ทธ๋๋ก ๊ตฌํํด๋ ๊ฒ์ด๊ณ ๋ถ์์ ํด๋ณด์
- Time Complexity : O(nlogn)
- Space Complexity : O(n)
์ฌ๊ธฐ์ ๋ฉด์ ๊ด์ด Time / Space ์ค ํ๋๋ฅผ ์ค์ฌ๋ณด๋ผ๊ณ ํ๋ค.
๐งฑ Better Solution
๊ณผ๋ฐ์์ ์ง์คํด๋ณด์. ๊ตณ์ด ๋ฑ์ฅ ํ์๋ฅผ ์ธ์ ์ ๋ ฌํ ํ์์์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ณ ๊ณผ๋ฐ์๋ ์ด์ฐ๋๋ len(nums)//2 ์ธ๋ฑ์ค์ ์์ง ์์๊น? ์ด๋ฅผ ๋ํ๋ด๋ ์ฝ๋๋ฅผ ์ง๋ณด์
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# Better Solution
nums.sort()
return nums[len(nums)//2]
- Time Complexity : O(nlogn)
- Space Complexity : O(1)
๋ฉด์ ๊ด์ด ์๊ฐ๋ณต์ก๋๋ ์ ํ์ผ๋ก ๋ถํํ๋ค.
๐ Best Solution (Boyer Moore Voting)
์ฌ์ค ์ด๊ฑด ์ด ์๊ณ ๋ฆฌ์ฆ์ ์์์ผ ํ ์ ์๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ํน์ง์ผ๋ก๋ ๊ณผ๋ฐ์๊ฐ ๋ณด์ฅ์ด ๋์ด์ผ ํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์์๋ผ ์ ์๋ ๊ฒ์ ๊ณผ๋ฐ์ ์ด์์ ์ซ์๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ๊ฐ์ฅ ์ ๋ํ๋ด๋ ๊ทธ๋ฆผ์ด ์๋ค.
์ฝ๋๋ก ๋ณด์.
count = 0
ret = -1
for num in nums:
if count == 0: ret = num
if ret == num: count += 1
else: count -= 1
return ret
- Time Complexity : O(n)
- Space Complexity : O(1)
๊ฐ์ฅ ๋น ๋ฅด๋ฉฐ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ด ํ์์๋ ํ์ด์ด๋ค. ๋ ๋ฒจ์ easy์ด๋ ๋ง์ ๊ฒ์ ๋ณผ ์ ์๋ ๋ฌธ์ ์ธ ๊ฑฐ ๊ฐ๋ค.