Study Anything ๐Ÿง

438. Find All Anagrams in a String - Trial 2 ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜๋ฌธ์ œ ํ’€์ด/LeetCode

438. Find All Anagrams in a String - Trial 2

์†” 2022. 2. 3. 23:48

#HashTable #String #SlidingWindow

 

๋‘ ๋ฌธ์ž์—ด s์™€ p๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ๋•Œ p์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์‚ฌ์šฉ๋œ s์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹จ, ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ์š”์†Œ ์ˆœ์„œ๋Š” ์ƒ๊ด€์ด ์—†๋‹ค.

 

* ์• ๋„ˆ๊ทธ๋žจ(Anagram)์ด๋ž€?

๋‹จ์–ด๋‚˜ ๊ตฌ์˜ ๊ธ€์ž๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ๋งŒ๋“  ๋‹จ์–ด๋‚˜ ๊ตฌ๋ฌธ์œผ๋กœ, ๋ชจ๋“  ๊ธ€์ž๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

 

์˜ˆ์‹œ:

(Input) s = "cbaebabacd", p = "abc"
(Output) [0,6]

 


Trial 2 : Python3, 22/02/03

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        result = []
        phash = defaultdict(int)
        shash = defaultdict(int)
        
        for char in p:
            phash[char] += 1
            
        for idx, char in enumerate(s):
            shash[char] += 1
            
            # ๋ˆ„์ ๋œ ๋ฌธ์ž ์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๊ธฐ
            if idx >= len(p):
                delchar = s[idx-len(p)]
                if shash[delchar] > 1:
                    shash[delchar] -= 1
                elif shash[delchar] == 1:
                    del shash[delchar]
            
            if phash == shash:
                result.append(idx + 1 - len(p))
                
        return result

 

ํ’€์ด:

์ด์ „์— ํ’€์ด์— ์‚ฌ์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค๊ณ  ํ•œ HashTable(์ดํ•˜ HT) ๊ธฐ๋Šฅ๊ณผ Sliding Window ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋”๋ณด๊ธฐ

* Sliding Window ์•Œ๊ณ ๋ฆฌ์ฆ˜:

์ผ์ • ๋ฒ”์œ„์˜ ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•  ๋•Œ ์ค‘๋ณต๋˜๋Š” ๋ฒ”์œ„๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

๋จผ์ € p ๋ฌธ์ž์—ด์˜ HT๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (๋น„๊ตํ•  ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์ถ•)

์ฐธ๊ณ ๋กœ defaultdict(int)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐ’์„ 0์œผ๋กœ ์ฑ„์›Œ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์ดˆ๊ธฐํ™” ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๋‹ค์Œ์œผ๋กœ s ๋ฌธ์ž์—ด ๋‚ด์—์„œ ํ•œ ๋ฌธ์ž์”ฉ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜ค๋ž˜๋œ ๊ฐ’์„ ์‚ญ์ œํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ,

์ด ๋•Œ for ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” enumerate(์ž๋ฃŒํ˜•) ํ•จ์ˆ˜๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ž๋ฃŒํ˜•์„ ๋ฐ›์•„์„œ ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฆ‰, ์œ„์˜ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ s ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ฃผ์—ˆ์œผ๋ฏ€๋กœ s[idx] == char ๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.

 

s ๋ฌธ์ž์—ด์˜ HT์— ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋‹ค๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ p ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™์•„์ง„ ์ดํ›„๋ถ€ํ„ฐ๋Š”

๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์‚ญ์ œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ ์ง€์›Œ์•ผ ํ•  ๋ฌธ์ž๋ฅผ delchar ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  sHT ์—์„œ ํ•ด๋‹น ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ 1๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋Š” 1์„ ๋นผ์ฃผ๊ณ ,

๊ฐœ์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์š”์†Œ ์ž์ฒด๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

์š”์†Œ ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ด์œ ๋Š” pHT ์™€ ๋น„๊ตํ•  ๋•Œ ์š”์†Œ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ์ œ๋Œ€๋กœ ๋น„๊ต๊ฐ€ ์ด๋ค„์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„์— pHT ์™€ sHT ๋ฅผ ๋น„๊ตํ•ด์„œ ๋‘ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฐ€์žฅ ์ฒ˜์Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

(ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ ์• ๋„ˆ๊ทธ๋žจ์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ p ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ๋นผ๊ณ  1์„ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.)

 

 

๋ฆฌ๋ทฐ: 

๋Ÿฐํƒ€์ž„์€ 88.17%, ๋ฉ”๋ชจ๋ฆฌ๋Š” 77.56% ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๋‹ค.

์ฒซ ์‹œ๋„์—์„œ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ƒ๊ด€์—†์ด ๋– ์˜ค๋ฅด๋Š” ๋ฐฉ๋ฒ•๋Œ€๋กœ ํ’€์–ด์„œ

๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋Š” ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” ํƒ€์ž„๋ฆฌ๋ฐ‹์— ๊ฑธ๋ ธ๋‹ค.

๋‘ ๋ฒˆ์งธ์—๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์œ ๋…ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋„๊ตฌ(HashTable)์™€ ๊ด€๋ จ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•(Sliding Window)์„ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๊ณ  ์ฒซ ๋ฒˆ์งธ๋ณด๋‹ค ํ›จ์”ฌ ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ๋ฒ•์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์žŠ๊ณ  ์žˆ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์‹œ ์ฐพ์•„๋ณด๊ณ  ํ•ด๊ฒฐ๋ฒ•์— ์ ์šฉํ•˜๋ฉด์„œ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์„ ํ‘ธ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์˜€๋‹ค.

 

 

 

 

728x90
Comments