Skip to content

Commit a3a073a

Browse files
authored
Merge pull request #2166 from socow/main
[socow] WEEK 05 Solutions
2 parents 27301f5 + 2603248 commit a3a073a

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""
2+
121. Best Time to Buy and Sell Stock
3+
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
4+
5+
๋ฌธ์ œ: ์ฃผ์‹ ๊ฐ€๊ฒฉ ๋ฐฐ์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ํ•œ ๋ฒˆ ์‚ฌ๊ณ  ํ•œ ๋ฒˆ ํŒ”์•„์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต์„ ๊ตฌํ•˜๋ผ.
6+
(๋งค์ˆ˜๋Š” ๋งค๋„๋ณด๋‹ค ์•ž์„  ๋‚ ์งœ์—ฌ์•ผ ํ•จ)
7+
8+
์˜ˆ์‹œ:
9+
Input: prices = [7, 1, 5, 3, 6, 4]
10+
Output: 5 (1์ผ์— ์‚ฌ์„œ 4์ผ์— ํŒ”๋ฉด 6-1=5)
11+
"""
12+
13+
from typing import List
14+
15+
16+
# =============================================================================
17+
# ํ’€์ด 1: ๋ธŒ๋ฃจํŠธ ํฌ์Šค (Brute Force)
18+
# =============================================================================
19+
# ์•„์ด๋””์–ด: ๋ชจ๋“  (๋งค์ˆ˜์ผ, ๋งค๋„์ผ) ์กฐํ•ฉ์„ ํ™•์ธํ•˜์—ฌ ์ตœ๋Œ€ ์ด์ต์„ ์ฐพ๋Š”๋‹ค.
20+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(nยฒ) - ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ
21+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
22+
# ๊ฒฐ๊ณผ: Time Limit Exceeded (์‹œ๊ฐ„ ์ดˆ๊ณผ)
23+
# =============================================================================
24+
class Solution:
25+
def maxProfit(self, prices: List[int]) -> int:
26+
result = 0
27+
28+
# i: ๋งค์ˆ˜์ผ (0 ~ n-2)
29+
for i in range(len(prices) - 1):
30+
# r: ๋งค๋„์ผ (i+1 ~ n-1), ๋งค์ˆ˜์ผ ์ดํ›„์—ฌ์•ผ ํ•จ
31+
for r in range(i + 1, len(prices)):
32+
# ํ˜„์žฌ ์กฐํ•ฉ์˜ ์ด์ต = ๋งค๋„๊ฐ€ - ๋งค์ˆ˜๊ฐ€
33+
profit = prices[r] - prices[i]
34+
result = max(result, profit)
35+
36+
return result
37+
38+
39+
# =============================================================================
40+
# ํ’€์ด 2: ํ•œ ๋ฒˆ ์ˆœํšŒ (One Pass) - ์ตœ์ ํ™”
41+
# =============================================================================
42+
# ์•„์ด๋””์–ด: ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ "์ง€๊ธˆ๊นŒ์ง€์˜ ์ตœ์†Œ ๋งค์ˆ˜๊ฐ€"๋ฅผ ์ถ”์ ํ•œ๋‹ค.
43+
# ๊ฐ ๋‚ ์งœ์—์„œ ํ˜„์žฌ ๊ฐ€๊ฒฉ์œผ๋กœ ํŒ”์•˜์„ ๋•Œ์˜ ์ด์ต์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
44+
#
45+
# ํ•ต์‹ฌ ํ†ต์ฐฐ:
46+
# - ํŠน์ • ๋‚ ์งœ์— ํŒ” ๋•Œ ์ตœ๋Œ€ ์ด์ต = ํ˜„์žฌ๊ฐ€๊ฒฉ - (์ด์ „๊นŒ์ง€์˜ ์ตœ์†Œ๊ฐ€๊ฒฉ)
47+
# - ๋”ฐ๋ผ์„œ ์ตœ์†Œ ๊ฐ€๊ฒฉ๋งŒ ์ถ”์ ํ•˜๋ฉด O(n)์— ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
48+
#
49+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) - ํ•œ ๋ฒˆ ์ˆœํšŒ
50+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
51+
# =============================================================================
52+
class Solution:
53+
def maxProfit(self, prices: List[int]) -> int:
54+
max_profit = 0 # ์ตœ๋Œ€ ์ด์ต
55+
min_price = prices[0] # ์ง€๊ธˆ๊นŒ์ง€์˜ ์ตœ์†Œ ๋งค์ˆ˜๊ฐ€
56+
57+
# 1์ผ์ฐจ๋ถ€ํ„ฐ ์ˆœํšŒ (0์ผ์ฐจ๋Š” min_price ์ดˆ๊ธฐ๊ฐ’)
58+
for price in prices[1:]:
59+
# ์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ์˜ ์ด์ต ๊ณ„์‚ฐ
60+
profit = price - min_price
61+
# ์ตœ๋Œ€ ์ด์ต ๊ฐฑ์‹ 
62+
max_profit = max(max_profit, profit)
63+
# ์ตœ์†Œ ๋งค์ˆ˜๊ฐ€ ๊ฐฑ์‹  (๋” ์‹ผ ๋‚ ์ด ์žˆ์œผ๋ฉด ์—…๋ฐ์ดํŠธ)
64+
min_price = min(min_price, price)
65+
66+
return max_profit
67+
68+

โ€Žgroup-anagrams/socow.pyโ€Ž

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
49. Group Anagrams
3+
https://leetcode.com/problems/group-anagrams/
4+
5+
๋ฌธ์ œ: ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ์• ๋„ˆ๊ทธ๋žจ๋ผ๋ฆฌ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋ผ.
6+
์• ๋„ˆ๊ทธ๋žจ = ๊ฐ™์€ ๋ฌธ์ž๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋‹จ์–ด (์ˆœ์„œ๋งŒ ๋‹ค๋ฆ„)
7+
8+
์˜ˆ์‹œ:
9+
Input: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
10+
Output: [["bat"], ["nat", "tan"], ["ate", "eat", "tea"]]
11+
12+
"eat", "tea", "ate" โ†’ ๋ชจ๋‘ a, e, t๋กœ ๊ตฌ์„ฑ โ†’ ๊ฐ™์€ ๊ทธ๋ฃน
13+
"tan", "nat" โ†’ ๋ชจ๋‘ a, n, t๋กœ ๊ตฌ์„ฑ โ†’ ๊ฐ™์€ ๊ทธ๋ฃน
14+
"bat" โ†’ ํ˜ผ์ž โ†’ ๋ณ„๋„ ๊ทธ๋ฃน
15+
"""
16+
17+
18+
# =============================================================================
19+
# ํ’€์ด 1: ์ •๋ ฌ(Sorted)์„ ํ‚ค๋กœ ์‚ฌ์šฉ
20+
# =============================================================================
21+
# ์•„์ด๋””์–ด: ์• ๋„ˆ๊ทธ๋žจ์€ ์ •๋ ฌํ•˜๋ฉด ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ๋œ๋‹ค!
22+
# "eat" โ†’ "aet", "tea" โ†’ "aet", "ate" โ†’ "aet"
23+
# ์ •๋ ฌ๋œ ๋ฌธ์ž์—ด์„ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃนํ™”
24+
#
25+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * k log k)
26+
# - n: ๋ฌธ์ž์—ด ๊ฐœ์ˆ˜
27+
# - k: ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
28+
# - ๊ฐ ๋ฌธ์ž์—ด์„ ์ •๋ ฌํ•˜๋Š”๋ฐ O(k log k)
29+
#
30+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n * k) - ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ๋”•์…”๋„ˆ๋ฆฌ์— ์ €์žฅ
31+
# =============================================================================
32+
class Solution:
33+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
34+
anagram_map = {} # ์ผ๋ฐ˜ ๋”•์…”๋„ˆ๋ฆฌ
35+
36+
for word in strs:
37+
sorted_key = "".join(sorted(word))
38+
39+
# ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ๋จผ์ € ๋นˆ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
40+
if sorted_key not in anagram_map:
41+
anagram_map[sorted_key] = []
42+
43+
# ๊ทธ ๋‹ค์Œ append
44+
anagram_map[sorted_key].append(word)
45+
46+
return list(anagram_map.values())

0 commit comments

Comments
ย (0)