217. Contains Duplicate

1. Description

  • Given an integer arrayย nums, returnย trueย if any value appearsย at least twiceย in the array, and returnย falseย if every element is distinct.

2. Example

Example 1

Input:ย nums = [1,2,3,1] Output:ย true Explanation: The element 1 occurs at the indices 0 and 3.

Example 2

Input:ย nums = [1,2,3,4] Output:ย false Explanation: All elements are distinct.

3. Solution

  1. ์ฒซ๋ฒˆ์งธ ํ’€์ด
    • Runtime: 49ms
    • ์„ค๋ช…
      • ์ด ๋ฐฉ๋ฒ•์€ ๋‚ด ์นœ๊ตฌ(Seong)๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
      • List๋ฅผ ์ •๋ ฌ์„ ํ•œ๋‹ค.
      • List์˜ ์ฒซ๋ฒˆ์งธ index๋ฅผ i๋กœ ์นญํ•˜๊ณ  i์™€ i+1๋ฒˆ์งธ List value๋ฅผ ๋น„๊ตํ•œ๋‹ค.
      • ์ด๋ฅผ range(len(list)-1)๋งŒํผ for๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค.
      • i์™€ i+1๋ฒˆ์งธ List value๊ฐ€ ๊ฐ™๋‹ค๋ฉด return True, ๋‹ค๋ฅด๋ฉด return False๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
class Solution:
    def hasDuplicate(self, nums: List[int]) -> bool:
        new = sorted(nums)
        #nums.sort()
        i = 0
        
        for num in range(len(new)-1):
            if new[i] == new[i+1]:
                return True
            else: 
                i = i+1
        return False
  • ๐Ÿ“Œ๋Ÿฐํƒ€์ž„์„ ์ค„์—ฌ์„œ ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ ์ž ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.
  1. ๋‘๋ฒˆ์งธ ํ’€์ด
    • Runtime: 8ms
    • ์„ค๋ช…
      • ๋นˆ Set s๋ฅผ ์ •์˜ํ•œ๋‹ค.
      • for๋ฌธ์œผ๋กœ nums๋ฆฌ์ŠคํŠธ๊ฐ€ ๋Œ์•„๊ฐˆ ๋•Œ, n์ด ๋นˆ Set์ธ s์•ˆ์— ์žˆ๋‹ค๋ฉด return True
      • s์•ˆ์— ์—†๋‹ค๋ฉด s์— n์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
      • for๋ฌธ์„ ๋‹ค๋Œ๋ ธ์„ ๋•Œ์—๋„ s์ง‘ํ•ฉ์•ˆ์— value์™€ ๊ฐ™์€ value๊ฐ€ ์—†๋‹ค๋ฉด return False
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        s = set()
        for n in nums:
            if n in s:
                return True
            else:
                s.add(n)
        return False

๋‘๋ฒˆ์งธ ํ’€์ด์—์„œ list๋Œ€์‹ ์— set๋ฅผ ์“ด ์ด์œ 

  • List
    • ๋ฆฌ์ŠคํŠธ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.
    • ์›์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•ด์•ผํ•œ๋‹ค.
    • ์ตœ์•…์˜ ๊ฒฝ์šฐ, ๋ชจ๋“  ์›์†Œ๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
      • ์›์†Œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ์„ ํ˜• ํƒ์ƒ‰(linear search)๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • Set
    • ์ง‘ํ•ฉ์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    • ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์›์†Œ๋ฅผ ๊ณ ์œ ํ•œ ํ•ด์‹œ ๊ฐ’(Hash Value)์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.
    • ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ๋•Œ, ํ•ด์‹œ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ฐ”๋กœ ํ•ด๋‹น ์›์†Œ์˜ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ O(1) ์‹œ๊ฐ„์— ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Hash Table
    • ํ‚ค-๊ฐ’(key-value) ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
    • Python์˜ set๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ(dict)์™€ ๊ฐ™์€ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํ•ด์‹œ ํ…Œ์ด๋ธ” ์›๋ฆฌ
      1. ์›์†Œ n์„ ์ €์žฅํ•  ๋•Œ, hash(n)์„ ๊ณ„์‚ฐํ•˜์—ฌ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜(๋ฒ„ํ‚ท)์„ ์ฐพ์Œ
      2. ํ•ด๋‹น ์œ„์น˜์— ์ €์žฅ
      3. n์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ๋•Œ๋„ ๊ฐ™์€ hash(n)์„ ์ด์šฉํ•˜์—ฌ ์ฆ‰์‹œ ํ™•์ธ ๊ฐ€๋Šฅ
  • ๐Ÿ“Œset๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์ด ํ‰๊ท ์ ์œผ๋กœ O(1) ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋œ๋‹ค.
    • n๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ ์ „์ฑ„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์ด๋‹ค.
  • ๐Ÿ“Œlist๋Š” if n in s๋ถ€๋ถ„์ด ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์ธ๋ฐ, ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
    • ์ด ์—ฐ์‚ฐ์ด ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ์— ๋Œ€ํ•ด ์‹คํ–‰๋˜๋ฏ€๋กœ, ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
  1. ์„ธ๋ฒˆ์งธ ํ’€์ด
    • Runtime: 0ms
    • ์„ค๋ช…
      • nums์˜ list ๊ธธ์ด์™€ set์˜ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅด๋ฉด return True ๊ฐ™์œผ๋ฉด return False
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len(nums) != len(set(nums))
  • ๐Ÿ“Œset์™€ list์˜ ์„ฑ์งˆ์„ ์ด์šฉํ•ด์„œ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ’€์ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋‹ค.

4. What I Learned

References

Chat GPT