Skip to content

Commit 334b8f0

Browse files
committed
[7th batch] week 6 - design add and search words data structure
1 parent e7657c5 commit 334b8f0

1 file changed

Lines changed: 80 additions & 0 deletions

File tree

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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

Comments
ย (0)