From 99a05a0f28ffb45a61d1ff81b18de492291f971e Mon Sep 17 00:00:00 2001 From: vmop899 Date: Tue, 7 Jan 2025 17:53:43 +0900 Subject: [PATCH 1/6] FEAT : 2 problems solved --- best-time-to-buy-and-sell-stock/aa601.py | 15 +++++++++++++++ group-anagrams/aa601.py | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 best-time-to-buy-and-sell-stock/aa601.py create mode 100644 group-anagrams/aa601.py diff --git a/best-time-to-buy-and-sell-stock/aa601.py b/best-time-to-buy-and-sell-stock/aa601.py new file mode 100644 index 000000000..f5944a1ec --- /dev/null +++ b/best-time-to-buy-and-sell-stock/aa601.py @@ -0,0 +1,15 @@ +class Solution: + def maxProfit(self, prices: list[int]) -> int: + min_p = prices[0] + cur = 0 + max_p = 0 + for n in prices: + if n < min_p: + min_p = n + cur = n - min_p + if max_p < cur: + max_p = cur + + return max_p + + \ No newline at end of file diff --git a/group-anagrams/aa601.py b/group-anagrams/aa601.py new file mode 100644 index 000000000..3d9f6dc5b --- /dev/null +++ b/group-anagrams/aa601.py @@ -0,0 +1,16 @@ +class Solution: + def groupAnagrams(self, strs: list[str]) -> list[list[str]]: + ans = {} + + for word in strs: + # 단어의 문자를 정렬 후 키로 사용 + sortedWord = ''.join(sorted(word)) + # 초기 리스트 생성 + if sortedWord not in ans: + ans[sortedWord] = [] + ans[sortedWord].append(word) + + # 딕셔너리의 value를 list로 변환 + ansLst = list(ans.values()) + return ansLst + \ No newline at end of file From af7f0942ba907d85f995dbf136363829b6d33e5d Mon Sep 17 00:00:00 2001 From: vmop899 Date: Tue, 7 Jan 2025 18:19:22 +0900 Subject: [PATCH 2/6] CHORE : added comment --- best-time-to-buy-and-sell-stock/aa601.py | 13 ++++++----- group-anagrams/aa601.py | 29 ++++++++++++------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/best-time-to-buy-and-sell-stock/aa601.py b/best-time-to-buy-and-sell-stock/aa601.py index f5944a1ec..144715912 100644 --- a/best-time-to-buy-and-sell-stock/aa601.py +++ b/best-time-to-buy-and-sell-stock/aa601.py @@ -1,15 +1,16 @@ +# 시간복잡도 O(n) +# 공간복잡도 O(1) class Solution: def maxProfit(self, prices: list[int]) -> int: - min_p = prices[0] + min_p = prices[0] # 최소 가격 설정 : 배열의 첫 번째 가격 cur = 0 max_p = 0 for n in prices: - if n < min_p: + if n < min_p: # 현재 가격이 최소 가격보다 작다면 최소가격 갱신 min_p = n - cur = n - min_p - if max_p < cur: - max_p = cur + cur = n - min_p # 현재 이익 계산 + if max_p < cur: # 현재 이익과 최대로 얻을 수 있는 이익 비교 + max_p = cur # 최대 이익 갱신신 return max_p - \ No newline at end of file diff --git a/group-anagrams/aa601.py b/group-anagrams/aa601.py index 3d9f6dc5b..0c5a5c8ef 100644 --- a/group-anagrams/aa601.py +++ b/group-anagrams/aa601.py @@ -1,16 +1,15 @@ +# 시간복잡도 O(n) +# 공간복잡도 O(1) class Solution: - def groupAnagrams(self, strs: list[str]) -> list[list[str]]: - ans = {} - - for word in strs: - # 단어의 문자를 정렬 후 키로 사용 - sortedWord = ''.join(sorted(word)) - # 초기 리스트 생성 - if sortedWord not in ans: - ans[sortedWord] = [] - ans[sortedWord].append(word) - - # 딕셔너리의 value를 list로 변환 - ansLst = list(ans.values()) - return ansLst - \ No newline at end of file + def maxProfit(self, prices: list[int]) -> int: + min_p = prices[0] # 최소 가격 설정 : 배열의 첫 번째 가격 + cur = 0 + max_p = 0 + for n in prices: + if n < min_p: # 현재 가격이 최소 가격보다 작다면 최소가격 갱신 + min_p = n + cur = n - min_p # 현재 이익 계산 + if max_p < cur: # 현재 이익과 최대로 얻을 수 있는 이익 비교 + max_p = cur # 최대 이익 갱신신 + + return max_p From fb2e86e218108e8b8742237a4cb0d124f527b8ae Mon Sep 17 00:00:00 2001 From: aa601 <152935684+aa601@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:20:31 +0900 Subject: [PATCH 3/6] Update aa601.py --- group-anagrams/aa601.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/group-anagrams/aa601.py b/group-anagrams/aa601.py index 0c5a5c8ef..823d2c958 100644 --- a/group-anagrams/aa601.py +++ b/group-anagrams/aa601.py @@ -13,3 +13,6 @@ def maxProfit(self, prices: list[int]) -> int: max_p = cur # 최대 이익 갱신신 return max_p + + + From 5ee2c5b3c6588511a67c2fc7cce0eaf5f710d0a8 Mon Sep 17 00:00:00 2001 From: aa601 <152935684+aa601@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:21:49 +0900 Subject: [PATCH 4/6] add newline --- best-time-to-buy-and-sell-stock/aa601.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/best-time-to-buy-and-sell-stock/aa601.py b/best-time-to-buy-and-sell-stock/aa601.py index 144715912..11ca42406 100644 --- a/best-time-to-buy-and-sell-stock/aa601.py +++ b/best-time-to-buy-and-sell-stock/aa601.py @@ -13,4 +13,7 @@ def maxProfit(self, prices: list[int]) -> int: max_p = cur # 최대 이익 갱신신 return max_p - \ No newline at end of file + + + + From c4af0e703d3ccc7e5d333cb73a87beafd2e1a9ed Mon Sep 17 00:00:00 2001 From: vmop899 Date: Thu, 9 Jan 2025 16:28:27 +0900 Subject: [PATCH 5/6] FEAT : solved word-break --- word-break/aa601.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 word-break/aa601.py diff --git a/word-break/aa601.py b/word-break/aa601.py new file mode 100644 index 000000000..f19a4a51f --- /dev/null +++ b/word-break/aa601.py @@ -0,0 +1,17 @@ +#시간복잡도 O(N * M) +#공간복잡도 O(N) +class Solution: + def wordBreak(self, s: str, wordDict: list[str]) -> bool: + # 문자열 s의 0번째부터 i번째까지의 문자열이 wordDict의 단어로 분할될 수 있으면 True + # 빈 문자열 s[0:0]은 항상 분할이 가능하므로 dp[0] = True + dp = [False] * (len(s) + 1) + dp[0] = True + for i in range(1, len(s) + 1): + for word in wordDict: + # 현재 word가 i - len(word)부터 i번째까지의 s의 부분문자열과 일치한다면 True + # 바로 이전의 지점이 True이고 word만큼의 s 부분문자열이 wordDict 내에 존재한다면 dp[i] = True + if i >= len(word) and dp[i - len(word)] and s[i - len(word):i] == word: + dp[i] = True + break + return dp[-1] + From c8e3ac8bd694942961e99fb412a239bc63c3191e Mon Sep 17 00:00:00 2001 From: vmop899 Date: Thu, 9 Jan 2025 16:28:45 +0900 Subject: [PATCH 6/6] CHORE : changed file and added comment for group-anagrams --- group-anagrams/aa601.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/group-anagrams/aa601.py b/group-anagrams/aa601.py index 823d2c958..aa393ec51 100644 --- a/group-anagrams/aa601.py +++ b/group-anagrams/aa601.py @@ -1,18 +1,19 @@ -# 시간복잡도 O(n) -# 공간복잡도 O(1) +#시간복잡도 O(n * klogk) +#공간복잡도 O(n * k) +# => n개의 단어 * 각 단어의 k만큼의 길이 class Solution: - def maxProfit(self, prices: list[int]) -> int: - min_p = prices[0] # 최소 가격 설정 : 배열의 첫 번째 가격 - cur = 0 - max_p = 0 - for n in prices: - if n < min_p: # 현재 가격이 최소 가격보다 작다면 최소가격 갱신 - min_p = n - cur = n - min_p # 현재 이익 계산 - if max_p < cur: # 현재 이익과 최대로 얻을 수 있는 이익 비교 - max_p = cur # 최대 이익 갱신신 - - return max_p - + def groupAnagrams(self, strs: list[str]) -> list[list[str]]: + ans = {} + for word in strs: + # 단어의 문자를 정렬 후 키로 사용 + sortedWord = ''.join(sorted(word)) # sorted()의 시간복잡도 : O(klogk) + # 초기 리스트 생성 + if sortedWord not in ans: + ans[sortedWord] = [] + ans[sortedWord].append(word) + # 딕셔너리의 value를 list로 변환 + ansLst = list(ans.values()) + return ansLst +