์ƒˆ์†Œ์‹

IN DEPTH CAKE/Supercoder

[์ฝ”๋”ฉ/LeetCode150-(5)] Majority Element (169)

  • -
๋ฐ˜์‘ํ˜•

 

๋ณธ ๊ธ€์€ LeetCode Top Interview 150์— ์ •๋ฆฌ๋œ ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ํ’€์ด๋ฅผ ํฌํ•จํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณธ ํฌ์ŠคํŒ… ์‹œ๋ฆฌ์ฆˆ๋Š” 150 list์˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ๊ฒŒ์žฌ๋ฉ๋‹ˆ๋‹ค. ํ’€์ด ์–ธ์–ด๋Š” python์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋‚œ์ด๋„: EASY

ํ‚ค์›Œ๋“œ: Array, Hash Table

 

 

๋ฌธ์ œ

๋ฌธ์ œ ์›๋ฌธ: https://leetcode.com/problems/majority-element/description/

 

ํฌ๊ธฐ๊ฐ€ n์ธ ๋ฐฐ์—ด nums๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ๋นˆ๋„ (the majority) ์›์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋ผ. ์ตœ๋นˆ (majority) ์›์†Œ๋Š” ํ•ญ์ƒ ์กด์žฌํ•˜๋ฉฐ, ์ด ์›์†Œ์˜ ์ˆ˜๋Š” ๋ฐฐ์—ด ๊ธธ์ด์˜ ์ ˆ๋ฐ˜์„ ๋„˜๋Š”๋‹ค.

 

์˜ˆ์ œ

Input: nums = [3,2,3]
Output: 3
Input: nums = [2,2,1,1,1,2,2]
Output: 2

 

ํ’€์ด (Runtime: Beats 90.34%, Memory Beats 27.75  %)

counter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ๋‚ด์— ์กด์žฌํ•˜๋Š” ์›์†Œ๋“ค์˜ ํšŸ์ˆ˜๋ฅผ ์–ป์€ ํ›„ (Hash Table์„ ์‚ฌ์šฉํ•œ counting) ์ด๋ฅผ key๊ฐ’์œผ๋กœํ•˜์—ฌ ์ •๋ ฌํ•˜์˜€์„ ๋•Œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜. ํ•˜์ง€๋งŒ ์ด ํ’€์ด์˜ ๊ฒฝ์šฐ์—๋Š” memory์˜ ์‚ฌ์šฉ์ด O(n)์ด๊ณ  runtime complexity์˜ ๊ฒฝ์šฐ hash map insertion์˜ ๋ณต์žก๋„๋ฅผ ๋”ฐ๋ผ O(n)์ด๋‹ค.

from collections import Counter

class Solution:
    def majorityElement(self, nums: List[int]) -> int:

        counter = Counter(nums)
        sorted_counter = sorted(counter.keys(), key= lambda x: counter[x], reverse=True)
        return sorted_counter[0]

 

์ด ์™ธ์—๋„ sorting์„ ๋จผ์ € ํ•œ ๋’ค์— indexing์œผ๋กœ ์ฐพ๋Š” ๋ฐฉ๋ฒ•๋“ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๐Ÿ”Ž Followup Question :
๋ณธ ๋ฌธ์ œ๋ฅผ linear time O(n) ๋‚ด์— O(1) space๋งŒ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋Š”๊ฐ€? 

 

๐Ÿ”–  Boyer-Moore Voting ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•

 

marjority์— ํ•ด๋‹นํ•˜๋Š” ์›์†Œ๋ฅผ +1 , ์•„๋‹Œ ๊ทธ์™ธ์˜ ์›์†Œ๋ฅผ -1์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ์ด๋“ค ์ „์ฒด์˜ ํ•ฉ์€ ์–‘์ˆ˜๋ฅผ ๋งŒ์กฑํ•ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์„ ์ˆœํšงํ•˜๋ฉด์„œ majority ๊ฐ’์˜ ํ›„๋ณด๋ฅผ ์ž„์˜๋กœ ์ •ํ•˜๊ณ  ์ด๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

majority ๊ฐ’์˜ ํ›„๋ณด๋ฅผ ๋งŒ๋‚˜๋ฉฐ +1, ์•„๋‹ˆ๋ฉด -1์„ ํ•˜๋Š” ๋ณ€์ˆ˜ count๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ•˜์ž. ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ count = 0์ธ ๊ฒฝ์šฐ ํ›„๋ณด ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ํ•ด๋‹น ํ›„๋ณด๋ฅผ ๋งŒ๋‚˜๋ฉด +1, ์•„๋‹ˆ๋ฉด -1์„ ํ•˜๋ฉฐ 0์ด ๋˜๋Š”๊ฒฝ์šฐ ํ›„๋ณด ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

class Solution:
    def majorityElement(self, nums: List[int]) -> int:

        count = 0

        for num in nums:

            if count == 0:
                candidate = num
            
            if num == candidate:
                count += 1
            else:
                count -= 1
        
        return candidate

 

๐Ÿ“š LeetCode 75 / Code Signal ํ’€์ด ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

# ๋กœ๋”ฉ ํ™”๋ฉด ๋™์ž‘ ์ฝ”๋“œ(Code) ์„ค์ •ํ•˜๊ธฐ