1+ # 7๊ธฐ ํ์ด
2+
3+ # ํด๋์ค ๊ณต๊ฐ ๋ณต์ก๋: O(W * L)
4+ # - W๋ word์ ๊ฐ์, L๋ word์ ํ๊ท ๊ธธ์ด.
5+
6+ # addWord ๋ฉ์๋
7+ # ์๊ฐ ๋ณต์ก๋: O(L)
8+ # - L๋ word์ ๊ธธ์ด. word์ ๊ธธ์ด๋งํผ ํ์ํ๋ฉฐ insertํจ
9+ # ๊ณต๊ฐ ๋ณต์ก๋: O(L)
10+ # - L๋ word์ ๊ธธ์ด. ๊ธธ์ด๋งํผ ์ฌ๊ท ์คํ์ด ์์
11+
12+ # search ๋ฉ์๋
13+ # ์๊ฐ ๋ณต์ก๋: O(W * L)
14+ # - W๋ ์ด๋ฏธ ์ฝ์
๋ ๋จ์ด์ ๊ฐ์, L๋ word์ ํ๊ท ๊ธธ์ด.
15+ # - ์ต์
์ธ ์กฐ๊ฑด์ word์ ๋ชจ๋ ๋ฌธ์๋ค์ด '.'์ผ ๋
16+ # ๊ณต๊ฐ ๋ณต์ก๋: O(L)
17+ # - L๋ word์ ๊ธธ์ด. ๊ธธ์ด๋งํผ ์ฌ๊ท ์คํ์ด ์์
18+
19+
20+ DELIMITER = "$" # ๋๋งบ์์ ๋ํ๋ด๋ DELIMITER๋ก "$"๋ฅผ ์ฌ์ฉ
21+
22+
23+ class WordDictionary :
24+ def __init__ (self ):
25+ self .word_dict = {}
26+
27+ def addWord (self , word : str ) -> None :
28+ # ์ฌ๊ท๋ฅผ ์ด์ฉํด ๋จ์ด๋ฅผ ๊ฐ ๋ฌธ์๋ณ๋ก insert
29+ def _add_word (curr_dict , word ):
30+ if not word :
31+ # ๋๋งบ์์ ๋ํ๋ด๋ DELIMITER๋ก "$"๋ฅผ ์ฌ์ฉ
32+ curr_dict [DELIMITER ] = {}
33+ return
34+
35+ s = word [0 ] # word์ ์ฒซ๋ฒ์งธ ๋ฌธ์
36+ if s not in curr_dict : # curr์ ์๋ ๊ฒฝ์ฐ์๋ ์๋ก key๋ฅผ ๋ง๋ ๋ค.
37+ curr_dict [s ] = {}
38+
39+ # ๋ค์ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ dictionary์
40+ # ํด๋น depth์์ ํ์ธํ ๋ฌธ์๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋ค์ ์์
์ํ
41+ _add_word (curr_dict [s ], word [1 :])
42+
43+ _add_word (self .word_dict , word )
44+
45+
46+ def search (self , word : str ) -> bool :
47+ # ์ฌ๊ท๋ฅผ ์ด์ฉํด ๋จ์ด๋ฅผ ๊ฐ ๋ฌธ์๋ณ๋ก ๋์ค๋ฅผ ํ๊ณ ๋ด๋ ค๊ฐ search
48+ def _search (curr_dict , word ):
49+ if not word :
50+ # ๋์ด์ ๊ฒ์ํ ๋ฌธ์์ด์ด ์์ ๋
51+ # DELIMITER์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ณด๊ณ return
52+ return DELIMITER in curr_dict
53+
54+ s = word [0 ]
55+ if s != '.' and s not in curr_dict :
56+ # ์์ผ๋ ์นด๋ ๋ฌธ์๊ฐ ์๋๋ฉด์, ์ฐพ์ผ๋ ค๋ ๋ฌธ์๊ฐ dictionary์ ์์ผ๋ฉด
57+ # insert๊ฐ ๋ ์ ์ด ์๋ ๋จ์ด์ด๋ฏ๋ก False๋ก early return
58+ return False
59+ elif s == '.' :
60+ # ์์ผ๋ ์นด๋ ๋ฌธ์์ด๋ฉด curr_dict์ ์๋ ๋ชจ๋ ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋ค์ depth๋ฅผ ํ์ธํ๋ค.
61+ for k in curr_dict .keys ():
62+ is_valid = _search (curr_dict [k ], word [1 :])
63+ if is_valid :
64+ # ํ๋๋ผ๋ True๋ผ๋ฉด search ๊ฒฐ๊ณผ๊ฐ ์ ํจํ๊ธฐ ๋๋ฌธ์
65+ # True๋ก early return
66+ return True
67+ # ๋ชจ๋ ๋ฌธ์์ด์ ํ์ํ๊ณ ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ค๋ฉด False return
68+ return False
69+ else :
70+ # ๊ทธ ์ธ์ ๊ฒฝ์ฐ๋ ์ผ๋ฐ ๋ฌธ์์ด ํ์์ ํด์ผ ํ๋ฏ๋ก
71+ # ์์ ๋ฌธ์์ด์ด ์๋ curr_dict[s]์
72+ # ํด๋น depth์์ ํ์ธํ ๋ฌธ์๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋ค์ ์์
์ํ
73+ return _search (curr_dict [s ], word [1 :])
74+
75+ return _search (self .word_dict , word )
76+
77+ # Your WordDictionary object will be instantiated and called as such:
78+ # obj = WordDictionary()
79+ # obj.addWord(word)
80+ # param_2 = obj.search(word)
0 commit comments