Skip to content

Commit b1e9f43

Browse files
authored
Merge pull request #1851 from hoyeongkwak/main
[hoyeongkwak] Week 5 Solutions
2 parents 81d5e7d + e52bc11 commit b1e9f43

File tree

4 files changed

+158
-0
lines changed

4 files changed

+158
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'''
2+
time complexity : O(n)
3+
space complexity : O(2n)
4+
5+
Algorithm : dp
6+
주식 보유하는 경우:
7+
- 이전에 이미 보유 : hold[i - 1]
8+
- i번째 날 새로 사는 경우 : -prices[i]
9+
10+
주식을 팔았을 떄:
11+
- 이전에 이미 팜 : sold[i - 1]
12+
- i번째 날 파는 경우 : hold[i-1] + prices[i]
13+
'''
14+
15+
class Solution:
16+
def maxProfit(self, prices: List[int]) -> int:
17+
if not prices or len(prices) < 2:
18+
return 0
19+
n = len(prices)
20+
hold = [0] * n
21+
sold = [0] * n
22+
23+
hold[0] = -prices[0]
24+
sold[0] = 0
25+
26+
for i in range(1, n):
27+
hold[i] = max(hold[i - 1], -prices[i])
28+
sold[i] = max(sold[i - 1], hold[i - 1] + prices[i])
29+
return sold[n - 1]

group-anagrams/hoyeongkwak.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'''
2+
m : 문자열 길이
3+
n : 반복
4+
time complexity : O(m * n * log m)
5+
space complexity : O(m * n)
6+
algorithm : sort, hash,
7+
각 문자열에 대해서 정렬을 하고, 정렬을 했을 때 동일한 문자에 대해서 hash table에 정렬 전 문자열을 추가
8+
그리고 마지막에 list 형태로 hash table의 value에 대해서 돌려 준다
9+
nat -> ant
10+
tan -> ant
11+
'''
12+
class Solution:
13+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
14+
strResult = {}
15+
for word in strs:
16+
sortedStr = ''.join(sorted(word))
17+
if sortedStr not in strResult:
18+
strResult[sortedStr] = []
19+
strResult[sortedStr].append(word)
20+
return list(strResult.values())
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
'''
2+
insert
3+
time complexity : O(m)
4+
space complexity : O(m)
5+
6+
search
7+
time complexity : O(m)
8+
space complexity : O(1)
9+
10+
startWith
11+
time complexity : O(m)
12+
space complexity : O(1)
13+
'''
14+
15+
class TrieNode:
16+
def __init__(self):
17+
self.children = {}
18+
self.isEnd = False
19+
20+
class Trie:
21+
def __init__(self):
22+
self.root = TrieNode()
23+
24+
def insert(self, word: str) -> None:
25+
node = self.root
26+
for char in word:
27+
if char not in node.children:
28+
node.children[char] = TrieNode()
29+
node = node.children[char]
30+
node.isEnd = True
31+
32+
33+
def search(self, word: str) -> bool:
34+
node = self.root
35+
for char in word:
36+
if char not in node.children:
37+
return False
38+
node = node.children[char]
39+
return node.isEnd
40+
41+
def startsWith(self, prefix: str) -> bool:
42+
node = self.root
43+
for char in prefix:
44+
if char not in node.children:
45+
return False
46+
node = node.children[char]
47+
return True
48+
49+
# Your Trie object will be instantiated and called as such:
50+
# obj = Trie()
51+
# obj.insert(word)
52+
# param_2 = obj.search(word)
53+
# param_3 = obj.startsWith(prefix)

word-break/hoyeongkwak.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
'''
2+
TrieNode
3+
a : alphabet size
4+
time complexity : O(m)
5+
space complexity : O(m * a)
6+
7+
dp
8+
time complexity : O(n^2)
9+
space complexity : O(n)
10+
'''
11+
class TrieNode:
12+
def __init__(self):
13+
self.children = {}
14+
self.isEnd = False
15+
class Trie:
16+
def __init__(self):
17+
self.root = TrieNode()
18+
19+
def insert(self, word):
20+
node = self.root
21+
for char in word:
22+
if char not in node.children:
23+
node.children[char] = TrieNode()
24+
node = node.children[char]
25+
node.isEnd = True
26+
27+
def search(self, s, start_idx):
28+
node = self.root
29+
endPosition = []
30+
31+
for i in range(start_idx, len(s)):
32+
char = s[i]
33+
if char not in node.children:
34+
break
35+
node = node.children[char]
36+
if node.isEnd:
37+
endPosition.append(i + 1)
38+
return endPosition
39+
40+
class Solution:
41+
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
42+
trie = Trie()
43+
for word in wordDict:
44+
trie.insert(word)
45+
n = len(s)
46+
dp = [False] * (n + 1)
47+
dp[0] = True
48+
49+
for i in range(n):
50+
if not dp[i]:
51+
continue
52+
endPositions = trie.search(s, i)
53+
54+
for endPos in endPositions:
55+
dp[endPos] = True
56+
return dp[n]

0 commit comments

Comments
 (0)