๐Ÿ’ซ ETC/Leetcode

Week 2-1. [Hash Table] 383. Ransom Note (Python3)

ming412 2023. 9. 1. 01:12

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

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

https://leetcode.com/problems/ransom-note/?envType=study-plan-v2&envId=top-interview-150 

 

Ransom Note - LeetCode

Can you solve this real interview question? Ransom Note - Given two strings ransomNote and magazine, return true if ransomNote can be constructed by using the letters from magazine and false otherwise. Each letter in magazine can only be used once in ranso

leetcode.com

ransomNote์™€ magazine ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ,
magazine์˜ ์ฒ ์ž๋“ค์„ ์ด์šฉํ•ด ransomNote๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด True, ์—†๋‹ค๋ฉด False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.
  • | ransomNote, magazine | ∈ [1, 10^5]
  • ransomNote์™€ magazine์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

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

์˜ˆ๋ฅผ ๋“ค์–ด magazine="aab"์ด๊ณ  ransomNote="aa"๋ผ๋ฉด magazine์˜ ์ฒ ์ž๋กœ ransomNote๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ True๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ๋ณด์ž๋งˆ์ž ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์ƒ๊ฐ๋‚ฌ๋‹ค.

magazine์„ ์ˆœํšŒํ•˜๋ฉฐ ๋”•์…”๋„ˆ๋ฆฌ์— ์•ŒํŒŒ๋ฒณ๊ณผ ๋นˆ๋„์ˆ˜๋ฅผ ๋ˆ„์ ํ•˜๊ณ , ์ด์–ด์„œ ransomNote๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ™์€ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ ๋นˆ๋„์ˆ˜๋ฅผ ์ฐจ๊ฐํ•œ๋‹ค.

 

ransomNote๋ฅผ ๋‹ค ์ˆœํšŒํ–ˆ์„ ๋•Œ, ๋”•์…”๋„ˆ๋ฆฌ์— ์–‘์ˆ˜ ํ˜น์€ 0์€ ์žˆ์–ด๋„ ๋˜์ง€๋งŒ ์Œ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

(๋”•์…”๋„ˆ๋ฆฌ values์— ์Œ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ransomNote์—๋Š” ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์ด magazine์—๋Š” ์—†์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.)

 

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

ransomNote์™€ magazine์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 10^5์ด๋ฏ€๋กœ linear search๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

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

magazine์„ ์ˆœํšŒํ•˜๋ฉฐ:
	๋”•์…”๋„ˆ๋ฆฌ์— ๊ฐ ์›์†Œ์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๋ˆ„์ ํ•œ๋‹ค.
    
ransomNote๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ:
	๋”•์…”๋„ˆ๋ฆฌ์—์„œ ๊ฐ ์›์†Œ์˜ ๋นˆ๋„์ˆ˜๋ฅผ ์ฐจ๊ฐํ•œ๋‹ค.
    
๋”•์…”๋„ˆ๋ฆฌ์˜ values๊ฐ€ ๋ชจ๋‘ ์–‘์ˆ˜์ด๋ฉด: return True
์•„๋‹ˆ๋ฉด: return False

 

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

from collections import defaultdict

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:

        dic = defaultdict(int)
        for x in magazine:
            dic[x] += 1

        for x in ransomNote:
            dic[x] -= 1

        if all(x >= 0 for x in dic.values()): return True
        else: return False

 

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

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

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

 

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

1์ดˆ ์ œํ•œ์—์„œ O(n)์˜ ์ตœ๋Œ€ ์ž…๋ ฅ์€ 10^6์ด๋‹ค. ๋ฌธ์ œ์—์„œ๋Š” ์ตœ๋Œ€ ์ž…๋ ฅ์ด 10^5์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์€ ๊ดœ์ฐฎ๋‹ค.

 

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

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

Counter ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด์˜ ๋นˆ๋„์ˆ˜๋ฅผ ์นด์šดํŠธ ํ•œ๋‹ค.

๋…ผ๋ฆฌ AND๋Š” ๊ต์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.

st1๊ณผ st2์˜ AND ๊ฒฐ๊ณผ๊ฐ€ st1 ์ด๋ผ๋ฉด magazine๊ณผ ransomNote์˜ ๊ต์ง‘ํ•ฉ์ด ransomNote๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:

        st1, st2 = Counter(ransomNote), Counter(magazine) # ๊ฐ ๋ฌธ์ž์—ด ๋นˆ๋„์ˆ˜ ์นด์šดํŠธ
        return st1 & st2 == st1 # ๋…ผ๋ฆฌ AND์˜ ๊ฒฐ๊ณผ๊ฐ€ st1์ด๋ผ๋ฉด True

 

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

Counter ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๊ฐ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋งŒํผ ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.

 

๋А๋‚€ ์ 

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ๋งŽ์ด ์—†๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค.