Skip to content

Commit 188ef5f

Browse files
committed
feat: Add Initial implementation to Word Break #271
- <139. Word Break> ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ๊ณผ ํŠธ๋ผ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•จ - ํŠธ๋ผ์ด๋ฅผ ํ†ตํ•ด ๋”•์…”๋„ˆ๋ฆฌ ๋‹จ์–ด ๊ฒ€์ƒ‰ ํšจ์œจ์€ ๊ฐœ์„ ํ–ˆ์œผ๋‚˜ ์žฌ๊ท€ ํ˜ธ์ถœ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต ์—ฐ์‚ฐ ๋ฌธ์ œ๋กœ ์ธํ•ด TLE ๋ฐœ์ƒ์„ ํ™•์ธํ•˜์˜€์Œ - ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋˜๋Š” DP๋กœ ์ตœ์ ํ™” ์˜ˆ์ •์ž„ - ๋ฌธ์ œ ์ด์Šˆ: #271
1 parent ff51e87 commit 188ef5f

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

โ€Žword-break/river20s.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
class TrieNode:
2+
def __init__(self):
3+
self.children = {}
4+
self.isEndOfWord = False
5+
6+
class Trie:
7+
def __init__(self):
8+
self.root = TrieNode()
9+
10+
def insert(self, word: str) -> None:
11+
currentNode = self.root
12+
for char in word:
13+
if char not in currentNode.children:
14+
currentNode.children[char] = TrieNode()
15+
currentNode = currentNode.children[char]
16+
currentNode.isEndOfWord = True
17+
18+
# <-- ์—ฌ๊ธฐ๊นŒ์ง€ Trie ๊ตฌํ˜„์„ ์œ„ํ•œ TrieNode์™€ Trie ํด๋ž˜์Šค
19+
# --> ์—ฌ๊ธฐ๋ถ€ํ„ฐ Word Break ๋ฌธ์ œ ํ‘ธ๋Š” Solution ํด๋ž˜์Šค
20+
21+
class Solution:
22+
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
23+
24+
# 1. ํŠธ๋ผ์ด ๊ตฌ์ถ•
25+
# wordDict ๋ชจ๋“  ๋‹จ์–ด -> ํŠธ๋ผ์ด ๋„ฃ๊ธฐ
26+
trie = Trie()
27+
for word in wordDict:
28+
trie.insert(word)
29+
30+
n = len(s) # ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด, ๋‚˜์ค‘์— ์ธ๋ฑ์Šค ๋๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ
31+
32+
# 2. ์žฌ๊ท€ ํ•จ์ˆ˜ ์ •์˜
33+
# canBreak(start_index): s[strat_index:] ๋ถ€๋ถ„์„ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
34+
def canBreak(start_index: int) -> bool:
35+
36+
# ๋ฒ ์ด์Šค ์ผ€์ด์Šค
37+
# ์‹œ์ž‘ ์ธ๋ฑ์Šค(start_index)๊ฐ€ ๋ฌธ์ž์—ด ๋์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด ์„ฑ๊ณต
38+
if start_index == n:
39+
return True
40+
41+
# ํ˜„์žฌ start_index๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ํŠธ๋ผ์ด๋ฅผ ์ด์šฉํ•ด ์ฐพ๊ณ 
42+
# ๊ฐ ๋‹จ์–ด์— ๋Œ€ํ•ด ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ™•์ธ
43+
currentNode = trie.root
44+
45+
for i in range(start_index, n):
46+
char = s[i]
47+
48+
# ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ํŠธ๋ผ์ด ๊ฒฝ๋กœ์— ์—†๋‹ค๋ฉด ํ•ด๋‹น ํŠธ๋ผ์ด ํƒ์ƒ‰์€ ๋”์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š์Œ
49+
if char not in currentNode.children:
50+
break
51+
52+
# ํŠธ๋ผ์ด์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™
53+
currentNode = currentNode.children[char]
54+
55+
# ์ด๋™ํ•œ ๋…ธ๋“œ๊ฐ€ ๋‹จ์–ด์˜ ๋์ด๋ผ๋ฉด
56+
if currentNode.isEndOfWord:
57+
# ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ s[i+1:]์— ๋Œ€ํ•ด์„œ๋„ ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ์ง€ ์žฌ๊ท€ ํ˜ธ์ถœ
58+
if canBreak(i + 1):
59+
# ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ ๋ถ„ํ•  ์„ฑ๊ณต => ์ „์ฒด ๋ถ„ํ•  ๊ฐ€๋Šฅ
60+
return True
61+
# start_index๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด ๋ถ„ํ• ์„ ์‹œ๋„ํ–ˆ์œผ๋‚˜
62+
# ์„ฑ๊ณต์ ์ธ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด
63+
return False
64+
65+
# 3. ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์ž‘
66+
return canBreak(0)

0 commit comments

Comments
ย (0)