Skip to content

Commit d4b8b1f

Browse files
authored
Merge pull request #860 from jungsiroo/main
[jungsiroo] Week 5
2 parents 7ae7503 + 3e2c6d9 commit d4b8b1f

File tree

4 files changed

+141
-0
lines changed

4 files changed

+141
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution:
2+
def maxProfit(self, prices: List[int]) -> int:
3+
"""
4+
๊ฐ€์žฅ ์ˆ˜์ต์„ ๋งŽ์ด ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ €์ ์— ๋งค์ˆ˜, ๊ณ ์ ์— ๋งค๋„
5+
๋งค์ˆ˜์™€ ๋งค๋„๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‚ 
6+
7+
min_price๋ฅผ ๋นผ๊ฐ€๋ฉด์„œ price ์—…๋ฐ์ดํŠธ
8+
9+
Time Complexity : O(n)
10+
Space Complexity : O(1)
11+
"""
12+
13+
min_price = max(prices)
14+
days = len(prices)
15+
16+
for day in range(days):
17+
min_price = min(prices[day], min_price)
18+
prices[day] -= min_price
19+
20+
return max(prices)
21+
22+
23+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from collections import defaultdict
2+
3+
class Solution:
4+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
5+
# Naive Solution : Sort string
6+
7+
# ๊ฐ ๋‹จ์–ด๋งˆ๋‹ค ๋ชจ๋‘ ์ •๋ ฌ์„ ํ•œ ๋’ค ํ•ด๋‹น ๊ฐ’์„ hash๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋”•์…”๋„ˆ๋ฆฌ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•
8+
# strs[i].length = k
9+
# Time Complexity : O(n*klog(k))
10+
# Space Complexity : O(n*k)
11+
12+
"""
13+
14+
n = len(strs)
15+
word_dict = defaultdict(list)
16+
17+
for word in strs:
18+
key = hash(''.join(sorted(word)))
19+
word_dict[key].append(word)
20+
21+
ret = []
22+
for value in word_dict.values():
23+
ret.append(value)
24+
return ret
25+
"""
26+
27+
# Better Solution : Counting
28+
29+
# anagram ์˜ ํŠน์„ฑ ์ค‘ ์•ŒํŒŒ๋ฒณ ์นด์šดํŠธ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์ด์šฉ
30+
# ์นด์šดํŠธ ๊ฐฏ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ key ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ
31+
# Time Complexity : O(n*k)
32+
# Space Complexity : O(n*k)
33+
word_dict = defaultdict(list)
34+
35+
for word in strs:
36+
freq = [0]*26
37+
for char in word:
38+
freq[ord(char) - ord('a')] += 1
39+
word_dict[tuple(freq)].append(word)
40+
41+
return list(word_dict.values())
42+
43+
44+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""
2+
Recursive vs Iterative
3+
4+
์žฌ๊ท€ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ๋งŒ์•ฝ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ต‰์žฅํžˆ ๊ธธ๋‹ค๋ฉด ๊ทธ๋งŒํผ์˜ ์ฝœ์ด ์ผ์–ด๋‚˜๊ณ  ์ด๋Š” ์„ฑ๋Šฅ์ ์œผ๋กœ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ.
5+
๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฉด์—์„œ๋Š” O(m) ์ž„ (m = len(string))
6+
7+
Node ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋‘์–ด ์ฒ˜๋ฆฌํ•˜๋ฉด ๊ฐ€๋…์„ฑ ๋†’๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
8+
"""
9+
10+
class Node:
11+
def __init__(self, key=None):
12+
self.key = key
13+
self.children = {}
14+
self.is_end = False
15+
16+
class Trie:
17+
def __init__(self):
18+
self.head = Node()
19+
20+
def insert(self, word: str) -> None:
21+
curr = self.head
22+
23+
for ch in word:
24+
if ch not in curr.children:
25+
curr.children[ch] = Node(ch)
26+
curr = curr.children[ch]
27+
curr.is_end = True
28+
29+
def search(self, word: str) -> bool:
30+
curr = self.head
31+
32+
for ch in word:
33+
if ch not in curr.children:
34+
return False
35+
curr = curr.children[ch]
36+
37+
return curr.is_end
38+
39+
def startsWith(self, prefix: str) -> bool:
40+
curr = self.head
41+
42+
for ch in prefix:
43+
if ch not in curr.children:
44+
return False
45+
curr = curr.children[ch]
46+
return True
47+

โ€Žword-break/jungsiroo.pyโ€Ž

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution:
2+
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
3+
# DP๋ฅผ ํ™œ์šฉํ•œ ๋ฌธ์ œ
4+
5+
"""
6+
KMP๋‚˜ Rabin Karp๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์ธ ์ค„ ์•Œ์•˜์œผ๋‚˜ ์ „ํ˜€ ์•„๋‹Œ ๋ฌธ์ œ
7+
neetcode์˜ ๋„์›€์„ ๋ฐ›์•˜์Œ
8+
9+
๊ณ„์† ์ˆœํšŒ๋ฅผ ํ•˜๋ฉด์„œ if dp[j]๋ฅผ ํ†ตํ•ด ๊ธธ์ด๋งŒํผ ๋Š์–ด์ฃผ๊ณ  word_set์— ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•จ
10+
Time Complexity : O(n^2)
11+
Space Complexity : O(n)
12+
"""
13+
14+
word_set = set(wordDict)
15+
n = len(s)
16+
17+
dp = [False] * (n + 1)
18+
dp[0] = True
19+
20+
for i in range(1, n + 1):
21+
for j in range(i):
22+
if dp[j] and s[j:i] in word_set:
23+
dp[i] = True
24+
break
25+
26+
return dp[n]
27+

0 commit comments

Comments
ย (0)