From cdb6714098f4428f955fed8621779b0b94d7d939 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Tue, 10 Sep 2024 00:52:10 +0900 Subject: [PATCH 01/10] Best Time to Buy and Sell Stock Solution --- best-time-to-buy-and-sell-stock/kayden.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 best-time-to-buy-and-sell-stock/kayden.py diff --git a/best-time-to-buy-and-sell-stock/kayden.py b/best-time-to-buy-and-sell-stock/kayden.py new file mode 100644 index 000000000..9b81b5069 --- /dev/null +++ b/best-time-to-buy-and-sell-stock/kayden.py @@ -0,0 +1,15 @@ +# 시간복잡도: O(N) +# 공간복잡도: O(1) +class Solution: + def maxProfit(self, prices: List[int]) -> int: + + answer = 0 + cur = float(inf) + for price in prices: + if cur < price: + answer = max(answer, price - cur) + + if price < cur: + cur = price + + return answer \ No newline at end of file From 136a24663369d835cbb01432c566269f74e45dc0 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Tue, 10 Sep 2024 00:56:05 +0900 Subject: [PATCH 02/10] Fix Best Time to Buy Sell Stock Solution --- best-time-to-buy-and-sell-stock/kayden.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/best-time-to-buy-and-sell-stock/kayden.py b/best-time-to-buy-and-sell-stock/kayden.py index 9b81b5069..4928b151d 100644 --- a/best-time-to-buy-and-sell-stock/kayden.py +++ b/best-time-to-buy-and-sell-stock/kayden.py @@ -12,4 +12,4 @@ def maxProfit(self, prices: List[int]) -> int: if price < cur: cur = price - return answer \ No newline at end of file + return answer From 38f42a235aea3686d6fdf26848169cfe95c623ec Mon Sep 17 00:00:00 2001 From: jinbeom Date: Tue, 10 Sep 2024 19:21:06 +0900 Subject: [PATCH 03/10] Group Anagrams Solution --- group-anagrams/kayden.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 group-anagrams/kayden.py diff --git a/group-anagrams/kayden.py b/group-anagrams/kayden.py new file mode 100644 index 000000000..8282d1b11 --- /dev/null +++ b/group-anagrams/kayden.py @@ -0,0 +1,10 @@ +# 시간복잡도: O(N) +# 공간복잡도: O(N) +class Solution: + def groupAnagrams(self, strs: List[str]) -> List[List[str]]: + groups = {} + for anagram in strs: + key = str(sorted(anagram)) + groups.setdefault(key, []).append(anagram) + + return list(groups.values()) From 483f9c3f9c57681a6e54d38a614704ff17aadce8 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Tue, 10 Sep 2024 19:24:07 +0900 Subject: [PATCH 04/10] Fix Group Anagrams Solution --- group-anagrams/kayden.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group-anagrams/kayden.py b/group-anagrams/kayden.py index 8282d1b11..ed8944896 100644 --- a/group-anagrams/kayden.py +++ b/group-anagrams/kayden.py @@ -1,4 +1,4 @@ -# 시간복잡도: O(N) +# 시간복잡도: O(N*AlogN) A: 0<= strs[i]의 길이 <= 100 # 공간복잡도: O(N) class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: From 41e0e8c41d7a36a3919a9423040bcdef20352dc0 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Tue, 10 Sep 2024 23:26:55 +0900 Subject: [PATCH 05/10] Fix Group Anagrams Solution --- group-anagrams/kayden.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group-anagrams/kayden.py b/group-anagrams/kayden.py index ed8944896..8e85bfc78 100644 --- a/group-anagrams/kayden.py +++ b/group-anagrams/kayden.py @@ -1,4 +1,4 @@ -# 시간복잡도: O(N*AlogN) A: 0<= strs[i]의 길이 <= 100 +# 시간복잡도: O(N*AlogA) A: 0<= strs[i]의 길이 <= 100 # 공간복잡도: O(N) class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: From 3d2514cbb38d732bbcfa5fe4f33d836d154df4e6 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Tue, 10 Sep 2024 23:43:11 +0900 Subject: [PATCH 06/10] 3Sum Solution --- 3sum/kayden.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 3sum/kayden.py diff --git a/3sum/kayden.py b/3sum/kayden.py new file mode 100644 index 000000000..511ee5169 --- /dev/null +++ b/3sum/kayden.py @@ -0,0 +1,57 @@ +class Solution: + + # 해시맵 + # 시간복잡도: O(N^2) + # 공간복잡도: O(N) + def threeSum(self, nums: List[int]) -> List[List[int]]: + n = len(nums) + nums.sort() + + check = {} + for idx, num in enumerate(nums): + check[num] = idx + + answer = set() + for i in range(n-2): + if nums[i] > 0: + break + if i > 0 and nums[i] == nums[i-1]: + continue + for j in range(i + 1, n): + target = -(nums[i] + nums[j]) + if not check.get(target, None): + continue + if j >= check[target]: + continue + + answer.add((nums[i], nums[j], target)) + + return list(answer) + + # 투포인터 + # 시간복잡도: O(N^2) + # 공간복잡도: O(N) + def threeSum2(self, nums: List[int]) -> List[List[int]]: + n = len(nums) + nums.sort() + + answer = set() + for i in range(n-2): + if nums[i] > 0: + break + if i > 0 and nums[i] == nums[i-1]: + continue + l, r = i+1, n-1 + while l -nums[i]: + r -= 1 + + return list(answer) From 83f14bebd38bcee766f76f2cbfdc087db9a37a1c Mon Sep 17 00:00:00 2001 From: jinbeom Date: Thu, 12 Sep 2024 21:38:31 +0900 Subject: [PATCH 07/10] Fix 3Sum Solution --- 3sum/kayden.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/3sum/kayden.py b/3sum/kayden.py index 511ee5169..629efbf0c 100644 --- a/3sum/kayden.py +++ b/3sum/kayden.py @@ -19,7 +19,7 @@ def threeSum(self, nums: List[int]) -> List[List[int]]: continue for j in range(i + 1, n): target = -(nums[i] + nums[j]) - if not check.get(target, None): + if not check.get(target): continue if j >= check[target]: continue @@ -47,6 +47,8 @@ def threeSum2(self, nums: List[int]) -> List[List[int]]: answer.add((nums[i], nums[l], nums[r])) l += 1 r -= 1 + while nums[l] == nums[l - 1] and l < r: + l += 1 if nums[l] + nums[r] < -nums[i]: l += 1 From f4159074af09e08b0d42002729abdfd78103583e Mon Sep 17 00:00:00 2001 From: jinbeom Date: Thu, 12 Sep 2024 21:43:15 +0900 Subject: [PATCH 08/10] Implement Trie Solution --- implement-trie-prefix-tree/kayden.py | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 implement-trie-prefix-tree/kayden.py diff --git a/implement-trie-prefix-tree/kayden.py b/implement-trie-prefix-tree/kayden.py new file mode 100644 index 000000000..0845a5902 --- /dev/null +++ b/implement-trie-prefix-tree/kayden.py @@ -0,0 +1,40 @@ +class Node: + + def __init__(self, ending=False): + self.children = {} + self.ending = ending + +# 공간복잡도: O(w*l) w: 단어 수 l: 단어의 평균 길이 +class Trie: + + def __init__(self): + self.head = Node(ending=True) + + # 시간복잡도: O(N) + def insert(self, word: str) -> None: + node = self.head + for ch in word: + if ch not in node.children: + node.children.setdefault(ch, Node()) + node = node.children[ch] + node.ending = True + + # 시간복잡도: O(N) + def search(self, word: str) -> bool: + node = self.head + for ch in word: + if ch not in node.children: + return False + node = node.children[ch] + + return node.ending + + # 시간복잡도: O(N) + def startsWith(self, prefix: str) -> bool: + node = self.head + for ch in prefix: + if ch not in node.children: + return False + node = node.children[ch] + + return True From e23a34e857187d12a15e5984003e53e3acdf9a39 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Thu, 12 Sep 2024 22:12:23 +0900 Subject: [PATCH 09/10] Word Break Solution --- word-break/kayden.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 word-break/kayden.py diff --git a/word-break/kayden.py b/word-break/kayden.py new file mode 100644 index 000000000..61ca96e8c --- /dev/null +++ b/word-break/kayden.py @@ -0,0 +1,25 @@ +# 시간복잡도: ? +# 공간복잡도: O(S) +class Solution: + def wordBreak(self, s: str, wordDict: List[str]) -> bool: + memo = {} + wordSet = set(wordDict) + + def dfs(idx): + if idx in memo: + return memo[idx] + + if idx == len(s): + return True + + for word in wordSet: + l = len(word) + if s[idx:idx + l] == word: + if dfs(idx + l): + memo[idx] = True + return True + + memo[idx] = False + return False + + return dfs(0) From fdbc181c2feaebfbf02e6a79735149655345fde0 Mon Sep 17 00:00:00 2001 From: jinbeom Date: Sat, 14 Sep 2024 01:37:25 +0900 Subject: [PATCH 10/10] Fix --- 3sum/kayden.py | 3 +++ word-break/kayden.py | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/3sum/kayden.py b/3sum/kayden.py index 629efbf0c..380e9a33b 100644 --- a/3sum/kayden.py +++ b/3sum/kayden.py @@ -50,6 +50,9 @@ def threeSum2(self, nums: List[int]) -> List[List[int]]: while nums[l] == nums[l - 1] and l < r: l += 1 + while nums[r] == nums[r + 1] and l < r: + r -= 1 + if nums[l] + nums[r] < -nums[i]: l += 1 diff --git a/word-break/kayden.py b/word-break/kayden.py index 61ca96e8c..cf3fec88f 100644 --- a/word-break/kayden.py +++ b/word-break/kayden.py @@ -1,10 +1,10 @@ -# 시간복잡도: ? +# 시간복잡도: O(S*W) +# S: s의 길이 300 W: worDict 각 단어의 총 길이 20*1000 +# 300 * 20*1000 = 6*1e6 (600만) # 공간복잡도: O(S) class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: memo = {} - wordSet = set(wordDict) - def dfs(idx): if idx in memo: return memo[idx] @@ -12,7 +12,7 @@ def dfs(idx): if idx == len(s): return True - for word in wordSet: + for word in wordDict: l = len(word) if s[idx:idx + l] == word: if dfs(idx + l):