Skip to content

Commit 9d0d157

Browse files
authored
Merge pull request #1784 from hu6r1s/main
[hu6r1s] WEEK 03 Solutions
2 parents 148f92e + 8cb65c8 commit 9d0d157

File tree

5 files changed

+228
-0
lines changed

5 files changed

+228
-0
lines changed

โ€Žcombination-sum/hu6r1s.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
class Solution:
2+
"""
3+
์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity):
4+
- ์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น(DFS) ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
5+
- ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ฐ ์กฐํ•ฉ์—์„œ ํ•œ ์ˆซ์ž๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋Š” ์ตœ๋Œ€ target // min(candidates)
6+
- ๊ฐ ๊นŠ์ด๋งˆ๋‹ค ์ตœ๋Œ€ len(candidates)๋งŒํผ ๋ถ„๊ธฐ ๊ฐ€๋Šฅ
7+
- ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ง€์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€: O(2^T), T = target
8+
(์ •ํ™•ํ•œ upper bound๋Š” ๊ณ„์‚ฐํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ, ๋Œ€๋žต์ ์œผ๋กœ๋Š” O(2^T) ๋˜๋Š” O(k^T)๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ)
9+
10+
๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity):
11+
- ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ์ตœ๋Œ€ ๊นŠ์ด: O(T), T = target (๊ฐ€์žฅ ์ž‘์€ ์ˆซ์ž๋งŒ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)
12+
- ๊ฒฝ๋กœ ์ €์žฅ์šฉ ๋ฆฌ์ŠคํŠธ(nums): O(T)
13+
- ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ๋ฆฌ์ŠคํŠธ(output): ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ ์ €์žฅ โ†’ O(number of valid combinations * ํ‰๊ท  ๊ธธ์ด)
14+
์ตœ์ข… ๊ณต๊ฐ„ ๋ณต์žก๋„: **O(T + R)**,
15+
T: ์žฌ๊ท€ ๊นŠ์ด / R: ๊ฒฐ๊ณผ ์กฐํ•ฉ ์ˆ˜๊ฐ€ ํด ๊ฒฝ์šฐ output์ด ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„
16+
17+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
18+
output, nums = [], []
19+
20+
def dfs(start, total):
21+
if total > target:
22+
return
23+
if total == target:
24+
output.append(nums[:])
25+
26+
for i in range(start, len(candidates)):
27+
nums.append(candidates[i])
28+
dfs(i, total + candidates[i])
29+
nums.pop()
30+
31+
dfs(0, 0)
32+
return output
33+
"""
34+
"""
35+
2. dp
36+
dp[i]๋Š” ์ˆซ์ž๋“ค์„ ๋”ํ•ด์„œ ํ•ฉ์ด i๊ฐ€ ๋˜๋Š” ๋ชจ๋“  ์กฐํ•ฉ๋“ค์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
37+
dp[num - candidate]์— ์žˆ๋Š” ์กฐํ•ฉ์— candidate๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด num์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
38+
์ค‘๋ณต๋œ ์กฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด candidates๋ฅผ ๋ฐ”๊นฅ ๋ฃจํ”„์— ๋‘  (์ฆ‰, ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๊ณ„์† ์žฌ์‚ฌ์šฉํ•˜๋˜, ์ด์ „ ์ˆซ์ž๋ถ€ํ„ฐ ๋ˆ„์ ).
39+
40+
์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity):
41+
๋ฐ”๊นฅ ๋ฃจํ”„: ํ›„๋ณด ์ˆซ์ž๋งŒํผ โ†’ O(N)
42+
์•ˆ์ชฝ ๋ฃจํ”„: target๊นŒ์ง€ ๋ฐ˜๋ณต โ†’ O(T)
43+
๊ฐ€์žฅ ์•ˆ์ชฝ ๋ฃจํ”„: dp[num - candidate]์— ์žˆ๋Š” ์กฐํ•ฉ๋“ค์„ ๋ชจ๋‘ ์ˆœํšŒ โ†’ O(A) (A๋Š” ์กฐํ•ฉ ๊ฐœ์ˆ˜ ๋ฐ ๊ธธ์ด์— ๋น„๋ก€)
44+
โ†’ ๋”ฐ๋ผ์„œ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N ร— T ร— A)
45+
46+
๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity):
47+
dp ๋ฐฐ์—ด ํฌ๊ธฐ: target + 1 โ†’ O(T)
48+
๊ฐ dp[i]์— ์ €์žฅ๋œ ์กฐํ•ฉ ๋ฆฌ์ŠคํŠธ๋“ค์˜ ๊ฐœ์ˆ˜์™€ ๊ธธ์ด โ†’ O(A)
49+
๋”ฐ๋ผ์„œ ์ „์ฒด ๊ณต๊ฐ„์€ O(T ร— A)
50+
51+
Example 2์˜ dp ์ถœ๋ ฅ:
52+
53+
[[[]], [], [[2]], [], [], [], [], [], []]
54+
[[[]], [], [[2]], [], [[2, 2]], [], [], [], []]
55+
[[[]], [], [[2]], [], [[2, 2]], [], [[2, 2, 2]], [], []]
56+
[[[]], [], [[2]], [], [[2, 2]], [], [[2, 2, 2]], [], [[2, 2, 2, 2]]]
57+
[[[]], [], [[2]], [[3]], [[2, 2]], [], [[2, 2, 2]], [], [[2, 2, 2, 2]]]
58+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2]], [], [[2, 2, 2, 2]]]
59+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2], [3, 3]], [], [[2, 2, 2, 2]]]
60+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2], [3, 3]], [[2, 2, 3]], [[2, 2, 2, 2]]]
61+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2], [3, 3]], [[2, 2, 3]], [[2, 2, 2, 2], [2, 3, 3]]]
62+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3], [5]], [[2, 2, 2], [3, 3]], [[2, 2, 3]], [[2, 2, 2, 2], [2, 3, 3]]]
63+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3], [5]], [[2, 2, 2], [3, 3]], [[2, 2, 3], [2, 5]], [[2, 2, 2, 2], [2, 3, 3]]]
64+
[[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3], [5]], [[2, 2, 2], [3, 3]], [[2, 2, 3], [2, 5]], [[2, 2, 2, 2], [2, 3, 3], [3, 5]]]
65+
"""
66+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
67+
dp = [[] for _ in range(target + 1)]
68+
dp[0] = [[]]
69+
70+
for candidate in candidates:
71+
for num in range(candidate, target + 1):
72+
for combination in dp[num - candidate]:
73+
dp[num].append(combination + [candidate])
74+
return dp[target]

โ€Ždecode-ways/hu6r1s.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
class Solution:
2+
def numDecodings(self, s: str) -> int:
3+
"""
4+
1. ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ
5+
_
6+
226 -> B, 26
7+
_
8+
26 -> B, 6
9+
_
10+
6 -> F "BBF"
11+
__
12+
26 -> Z "BZ"
13+
__
14+
226 -> V, 6
15+
_
16+
6 -> F "VF"
17+
18+
์‹œ๊ฐ„๋ณต์žก๋„: O(2^n) - ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋งŽ์•„ ๋งค์šฐ ๋น„ํšจ์œจ์ 
19+
๊ณต๊ฐ„๋ณต์žก๋„: O(n) - ์ตœ๋Œ€ ์žฌ๊ท€ ๊นŠ์ด๋งŒํผ ์Šคํƒ ์‚ฌ์šฉ
20+
"""
21+
# def dfs(start):
22+
# if start == len(s):
23+
# return 1
24+
# if s[start] == "0":
25+
# return 0
26+
# if start + 1 < len(s) and int(s[start:start+2]) < 27:
27+
# return dfs(start+1) + dfs(start+2)
28+
# else:
29+
# return dfs(start+1)
30+
# return dfs(0)
31+
32+
"""
33+
2. ์žฌ๊ท€ + ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜
34+
์‹œ๊ฐ„๋ณต์žก๋„: O(n) - ๊ฐ ์‹œ์ž‘ ์œ„์น˜์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐ
35+
๊ณต๊ฐ„๋ณต์žก๋„: O(n) - ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋”•์…”๋„ˆ๋ฆฌ์™€ ์žฌ๊ท€ ์Šคํƒ
36+
"""
37+
# memo = {len(s): 1}
38+
# def dfs(start):
39+
# if start in memo:
40+
# return memo[start]
41+
# if s[start] == "0":
42+
# memo[start] = 0
43+
# elif start + 1 < len(s) and int(s[start:start+2]) < 27:
44+
# memo[start] = dfs(start+1) + dfs(start+2)
45+
# else:
46+
# memo[start] = dfs(start+1)
47+
48+
# return memo[start]
49+
# return dfs(0)
50+
51+
"""
52+
3. DP
53+
์‹œ๊ฐ„๋ณต์žก๋„ (Time Complexity): O(n)
54+
- ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด๋งŒํผ ํ•œ ๋ฒˆ์˜ ๋ฃจํ”„๋ฅผ ๋„๋Š” DP ๋ฐฉ์‹
55+
56+
๊ณต๊ฐ„๋ณต์žก๋„ (Space Complexity): O(n)
57+
- ๊ธธ์ด n+1์งœ๋ฆฌ dp ๋ฐฐ์—ด ์‚ฌ์šฉ
58+
- ๊ณต๊ฐ„ ์ตœ์ ํ™”๋ฅผ ํ•˜๋ฉด O(1)๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
59+
"""
60+
dp = [0] * len(s) + [1]
61+
for i in range(len(s)-1, -1, -1):
62+
if s[i] == "0":
63+
dp[i] = 0
64+
elif i + 1 < len(s) and int(s[i:i+2]) < 27:
65+
dp[i] = dp[i+1] + dp[i+2]
66+
else:
67+
dp[i] = dp[i+1]
68+
return dp[0]

โ€Žmaximum-subarray/hu6r1s.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution:
2+
"""
3+
๋ถ€๋ถ„ํ•ฉ ํ™œ์šฉ
4+
dp[0] = nums[0]
5+
dp[1] = dp[0] + nums[1] ์™€ nums[1] ์ค‘ ํฐ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
6+
[-2, 1]๊นŒ์ง€์˜ ํ•ฉ๊ณผ [1]๊นŒ์ง€์˜ ํ•ฉ ์ค‘ ํฐ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
7+
dp[1] = [1]
8+
dp[2] = dp[1] + nums[2] ์™€ nums[2] ์ค‘ ํฐ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
9+
dp[1]์—์„œ [-2, 1]๋ฅผ ์„ ํƒํ–ˆ๋‹ค๋ฉด [-2, 1, -3]๊นŒ์ง€์˜ ํ•ฉ๊ณผ [1]์„ ์„ ํƒํ–ˆ๋‹ค๋ฉด [1, -3]๊นŒ์ง€์˜ ํ•ฉ ์ค‘ ํฐ ๊ฐ’์„ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.
10+
dp[2] = [1, -3]
11+
dp[3] = dp[2] + nums[3] ์™€ nums[3] ์ค‘ ํฐ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
12+
dp[3]์€ [1, -3]์— [4]๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ [1, -3, 4]๊นŒ์ง€์˜ ํ•ฉ๊ณผ nums[3]์ธ 4๋ฅผ ๋น„๊ตํ•˜์—ฌ ํฐ ๊ฐ’์œผ๋กœ ๋„ฃ๋Š”๋‹ค.
13+
๊ฒฐ๊ตญ ์ ํ™”์‹์€ dp[i] = max(dp[i-1] + nums[i], nums[i])๊ฐ€ ๋œ๋‹ค.
14+
15+
์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity):
16+
- dp ๋ฐฐ์—ด์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ ์ˆœํšŒ: O(n)
17+
- dp ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ ์ˆœํšŒ: O(n)
18+
โ†’ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
19+
20+
๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity):
21+
- dp ๋ฐฐ์—ด์ด ์ž…๋ ฅ ํฌ๊ธฐ๋งŒํผ ํ•„์š”: O(n)
22+
โ†’ ์ด ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
23+
"""
24+
def maxSubArray(self, nums: List[int]) -> int:
25+
dp = [0] * len(nums)
26+
dp[0] = nums[0]
27+
28+
for i in range(1, len(nums)):
29+
dp[i] = max(dp[i-1] + nums[i], nums[i])
30+
31+
return max(dp)

โ€Žnumber-of-1-bits/hu6r1s.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
"""
3+
1. n์ด 11์ผ๋•Œ, ์ด์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด๋ณด๋ฉด 1011์ด๋‹ค. set bits๋Š” 1์˜ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ธฐ์— 1์„ ์นด์šดํŠธํ•ด์ค€๋‹ค.
4+
์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity):
5+
- bin(n): ์ •์ˆ˜๋ฅผ ์ด์ง„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ โ†’ O(log n)
6+
(n์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋น„ํŠธ ์ˆ˜๋งŒํผ ์—ฐ์‚ฐํ•จ)
7+
- count('1'): ๋ฌธ์ž์—ด์—์„œ '1'์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•ด ์ „์ฒด ์ˆœํšŒ โ†’ O(log n)
8+
(์ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” logโ‚‚(n)์— ๋น„๋ก€)
9+
์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n)
10+
11+
๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity):
12+
- bin(n)์˜ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ ์ด์ง„ ๋ฌธ์ž์—ด์„ ์ €์žฅ โ†’ O(log n)
13+
- ๊ทธ ์™ธ ๋ณ„๋„์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„ ์—†์Œ
14+
์ตœ์ข… ๊ณต๊ฐ„ ๋ณต์žก๋„: O(log n)
15+
"""
16+
def hammingWeight(self, n: int) -> int:
17+
return bin(n).count('1')

โ€Žvalid-palindrome/hu6r1s.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution:
2+
"""
3+
1. ๋ฌธ์ž์—ด์„ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ isdigit() or isalpha()์ด True๋ผ๋ฉด string์— ๋ถ™์ด๊ธฐ
4+
๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚˜๋ฉด ์†Œ๋ฌธ์ž๋กœ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•˜๊ณ  ๋’ค์ง‘์€ ๋ฌธ์ž์™€ ๊ฐ™์œผ๋ฉด True ๋ฐ˜ํ™˜
5+
์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity):
6+
- ๋ฌธ์ž์—ด ์ˆœํšŒ: O(n)
7+
- ๋ฌธ์ž์—ด ๋ง๋ถ™์ด๊ธฐ(string += i): O(n^2) โ† ํŒŒ์ด์ฌ์—์„œ ๋ฌธ์ž์—ด์€ ๋ถˆ๋ณ€์ด๋ผ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ์ƒ์„ฑ
8+
- ์†Œ๋ฌธ์ž ๋ณ€ํ™˜ ๋ฐ ์Šฌ๋ผ์ด์‹ฑ ๋น„๊ต: ๊ฐ๊ฐ O(n)
9+
์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2)
10+
11+
๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity):
12+
- ํ•„ํ„ฐ๋ง๋œ ๋ฌธ์ž์—ด ์ €์žฅ์šฉ string: O(n)
13+
- ์—ญ์ˆœ ๋ฌธ์ž์—ด ์ƒ์„ฑ: O(n)
14+
์ตœ์ข… ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
15+
16+
2. ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž์ธ ๊ฒƒ๋งŒ ๋ฝ‘์•„ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ
17+
์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity):
18+
- ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜: O(n)
19+
- ๊ฐ ๋ฌธ์ž์— ๋Œ€ํ•ด isalnum() โ†’ O(1), lower() โ†’ O(1) ์ด๋ฏ€๋กœ ์ „์ฒด O(n)
20+
- ๋ฆฌ์ŠคํŠธ ์Šฌ๋ผ์ด์‹ฑ ๋ฐ ๋น„๊ต(string == string[::-1]): O(n)
21+
์ด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
22+
23+
๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity):
24+
- ๋ฆฌ์ŠคํŠธ string์— ์ตœ๋Œ€ n๊ฐœ์˜ ๋ฌธ์ž ์ €์žฅ: O(n)
25+
- ์Šฌ๋ผ์ด์‹ฑ๋œ string[::-1]๋„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ O(n)
26+
์ด ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
27+
"""
28+
def isPalindrome(self, s: str) -> bool:
29+
# string = ""
30+
31+
# for i in s:
32+
# if i.isdigit() or i.isalpha():
33+
# string += i
34+
# string = string.lower()
35+
# return True if string == string[::-1] else False
36+
37+
string = [i.lower() for i in s if i.isalnum()]
38+
return True if string == string[::-1] else False

0 commit comments

Comments
ย (0)