๐Ÿ’ซ ETC/Leetcode

Week 2-1. [Hash Table] 219. Contains Duplicate II (Python3)

ming412 2023. 8. 30. 16:47

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/contains-duplicate-ii/description/?envType=study-plan-v2&envId=top-interview-150 

 

Contains Duplicate II - LeetCode

Can you solve this real interview question? Contains Duplicate II - Given an integer array nums and an integer k, return true if there are two distinct indices i and j in the array such that nums[i] == nums[j] and abs(i - j) <= k.   Example 1: Input: nums

leetcode.com

์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ ๋‚ด์— ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค i์™€ j๊ฐ€ ์กด์žฌํ•˜์—ฌ nums[i]==nums[j]๋ฅผ ๋งŒ์กฑํ•˜๋ฉด์„œ abs(i-j) <= k ๋ผ๋ฉด, True๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.
  • | nums | ∈ [1, 10^4]

 

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

defaultdict๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nums์˜ ๊ฐ’์„ key๋กœ, ์ธ๋ฑ์Šค๋ฅผ value๋กœ ์ €์žฅํ•œ๋‹ค.

์ด ๋•Œ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค์˜ ์ธ๋ฑ์Šค๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์— ๋ˆ„์ ๋œ๋‹ค.

 

์ด์ œ ๋”•์…”๋„ˆ๋ฆฌ์˜ values๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ ˆ๋Œ“๊ฐ’์ด k ์ดํ•˜์ธ i์™€ j๊ฐ€ ์žˆ๋‹ค๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค์˜ ์ธ๋ฑ์Šค๋“ค์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

dic = defaultdict(list)

enumerate(nums)๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ:
	dic[x]์— i๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    
dic.values()๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ:
	๊ธธ์ด๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด์„œ ๊ฑฐ๋ฆฌ๊ฐ€ k๋ณด๋‹ค ์ž‘์œผ๋ฉด:
    	return True
        
return False

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

from collections import defaultdict

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:

        dic = defaultdict(list)
        for i, x in enumerate(nums):
            dic[x].append(i)

        for v in dic.values():
            if len(v) <= 1: continue # nums[i] == nums[j]์ธ i, j๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
            for i in range(len(v)-1):
                if abs(v[i] - v[i+1]) <= k: return True

        return False

๋งŒ์•ฝ nums๊ฐ€ [1, 0, 1, 1]์ด๋ผ๋ฉด, ๋”•์…”๋„ˆ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ดˆ๊ธฐํ™” ๋œ๋‹ค.

{
    1: [0, 2, 3],
 	0: [1]
}

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

linear search๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

1์ดˆ์˜ ์‹œ๊ฐ„ ์ œํ•œ์„ ๊ฐ–๋Š”๋‹ค๊ณ  ํ•  ๋•Œ, O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ์ฝ”๋“œ์—์„œ ์ž…๋ ฅ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ n์€ ๋Œ€๋žต 10^6์ด๋‹ค.

๋ฌธ์ œ์—์„œ ์ž…๋ ฅ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 10^5์ด๋ฏ€๋กœ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ๋ฌด์—‡์„/์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

dic.values()๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฑฐ๋ฆฌ(์ ˆ๋Œ“๊ฐ’)๊ฐ€ k ์ดํ•˜์ธ ๋‘ ์›์†Œ๋ฅผ ์ฒดํฌํ•  ๋•Œ์˜ ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๊ณ  ์‹ถ๋‹ค.

abs(v[i]-v[i+1])๋กœ ๋ชจ๋“  v๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  ํ•œ๋ฒˆ์— ๊ตฌํ• ์ˆ˜๋Š” ์—†์„๊นŒ?

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•œ ํ’€์ด๋กœ, set ์•ˆ์— ํ•ญ์ƒ k๊ฐœ์˜ ์›์†Œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

 

nums๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ํŠน์ • ์›์†Œ(nums[i])๊ฐ€ set ์•ˆ์— ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์›์†Œ(nums[i])์™€ set ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ k ์ดํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

 

๋งŒ์•ฝ set์˜ ๊ธธ์ด๊ฐ€ k+1์ด ๋œ๋‹ค๋ฉด, set ์•ˆ์—์„œ nums[i-k] ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

(nums[i-k]๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ค์–ด์˜จ ์›์†Œ(nums[i])๋กœ๋ถ€ํ„ฐ ๊ฑฐ๋ฆฌ๊ฐ€ k์ธ ์›์†Œ๋กœ ๊ฐ€์žฅ ์ฒ˜์Œ ๋“ค์–ด์˜จ ์›์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.)

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:

        if k == 0: return False

        st = set()
        for i in range(len(nums)):
            if nums[i] in st: return True
            st.add(nums[i])
            if len(st) == k+1:
                st.remove(nums[i-k])

        return False

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

linear search๋กœ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๋А๋‚€ ์ 

set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ set ์•ˆ์— k๊ฐœ์˜ ์›์†Œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ •๋ง ์ƒ๊ฐ์น˜ ๋ชปํ–ˆ๋‹ค.

 

"set์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋ฐ, set ๋Œ€์‹  ๋ฆฌ์ŠคํŠธ๋ฅผ ์จ์•ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€?" ์‹ถ์—ˆ์ง€๋งŒ, set ๋‚ด๋ถ€์—์„œ ๊ฐ’์ด nums[i-k]์ธ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๋”ฐ๋ผ์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์ฃผ๋Š” set์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํšจ์œจ์ ์ด๋‹ค.