Skip to content

Commit 1f1cf6f

Browse files
authored
Merge pull request #778 from thispath98/main
[thispath98] Week 3
2 parents 439086a + 25f4d4c commit 1f1cf6f

File tree

5 files changed

+162
-0
lines changed

5 files changed

+162
-0
lines changed

β€Žcombination-sum/thispath98.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution:
2+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
3+
"""
4+
Intuition:
5+
리슀트의 각 μ›μ†ŒλŠ” μ€‘λ³΅ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
6+
κ·Έλ ‡λ‹€λ©΄ target은 μž¬κ·€μ μœΌλ‘œ μ›μ†Œλ₯Ό μ‚¬μš©ν•΄μ„œ
7+
λͺ¨λ“  경우의 수λ₯Ό νƒμƒ‰ν•œλ‹€.
8+
9+
Time Complexity:
10+
O(N^2 log N):
11+
μ΄ˆκΈ°μ— 리슀트의 μ›μ†Œλ₯Ό μ •λ ¬ν•˜λŠ” 데에 O(N log N)이 μ†Œμš”λœλ‹€.
12+
λ˜ν•œ, μž¬κ·€ ν•¨μˆ˜λŠ” μ΅œλŒ€ N번 호좜될 수 있으며
13+
각 μž¬κ·€ ν•¨μˆ˜μ—μ„œλŠ” μ •λ ¬ν•˜μ—¬ μ„ΈνŠΈμ— μΆ”κ°€ν•˜λŠ” 경우
14+
O(N log N)이 μ†Œμš”λ˜κ³ ,
15+
N개의 μ›μ†Œμ— λŒ€ν•΄ for문을 λ°˜λ³΅ν•œλ‹€.
16+
λ”°λΌμ„œ O(N^2 log N)의 μ‹œκ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
17+
18+
Space Complexity:
19+
O(N):
20+
μ΅œμ•…μ˜ 경우 answer set에 λŒ€λž΅ N개의 tuple이 μ €μž₯λœλ‹€.
21+
λ”°λΌμ„œ O(N)의 κ³΅κ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
22+
"""
23+
candidates.sort() # O(N log N)
24+
answer_set = set()
25+
26+
27+
def dfs(n, arr):
28+
if n == 0:
29+
answer_set.add(tuple(sorted(arr))) # O(N log N)
30+
return
31+
32+
for candidate in candidates: # O(N)
33+
if n >= candidate:
34+
arr.append(candidate)
35+
dfs(n - candidate, arr)
36+
arr.pop()
37+
38+
39+
dfs(target, []) # O(N)
40+
answer = list(answer_set)
41+
return answer

β€Žmaximum-subarray/thispath98.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution:
2+
def maxSubArray(self, nums: List[int]) -> int:
3+
"""
4+
Intuition:
5+
μ΄μ „κΉŒμ§€μ˜ λˆ„μ ν•©μ—μ„œ ν˜„μž¬ μ›μ†Œλ₯Ό μΆ”κ°€ν• μ§€ 말지에 λŒ€ν•œ
6+
결정을 λ§€ iterationλ§ˆλ‹€ λ°˜λ³΅ν•œλ‹€.
7+
ν˜„μž¬ μ›μ†Œλ₯Ό μΆ”κ°€ν–ˆμ„ 경우(λˆ„μ ν•© + ν˜„μž¬ μ›μ†Œ)와
8+
ν˜„μž¬ μ›μ†Œλ₯Ό μ‹œμž‘μœΌλ‘œ ν•˜λŠ” 경우(ν˜„μž¬ μ›μ†Œ)λ₯Ό λΉ„κ΅ν•˜μ—¬
9+
dp 배열을 κ°±μ‹ ν•œλ‹€.
10+
11+
Time Complexity:
12+
O(N):
13+
리슀트λ₯Ό 1번 μˆœνšŒν•˜λ©° 닡을 μ°ΎμœΌλ―€λ‘œ,
14+
O(N)의 μ‹œκ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
15+
16+
Space Complexity:
17+
O(N):
18+
dp 배열에 N개의 time step을 μ €μž₯ν•˜λ―€λ‘œ
19+
O(N)의 κ³΅κ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
20+
21+
Key takeaway:
22+
μ΄ˆκΈ°μ—λŠ” two pointer 방식을 μƒκ°ν–ˆμœΌλ‚˜
23+
해결을 ν•˜μ§€ λͺ»ν•΄μ„œ λ‹΅μ•ˆμ„ ν™•μΈν–ˆλ‹€.
24+
O(N)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§€λŠ” 경우, DP도 풀이가
25+
될 수 μžˆμŒμ„ μΈμ§€ν•˜μž.
26+
"""
27+
dp = [0 for _ in nums]
28+
dp[0] = nums[0]
29+
for i in range(1, len(nums)):
30+
cumsum = dp[i - 1] + nums[i]
31+
cur = nums[i]
32+
if cumsum > cur:
33+
dp[i] = cumsum
34+
else:
35+
dp[i] = cur
36+
37+
return max(dp)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution:
2+
def productExceptSelf(self, nums: List[int]) -> List[int]:
3+
"""
4+
Intuition:
5+
i번째 인덱슀의 값을 κ³„μ‚°ν•˜κΈ° μœ„ν•΄μ„œλŠ”
6+
0 ~ i-1 κΉŒμ§€μ˜ κ°’κ³Ό i+1 ~ N κΉŒμ§€μ˜ 값을 λͺ¨λ‘ κ³±ν•΄μ•Ό ν•œλ‹€.
7+
이의 λˆ„μ κ³±μ„ μ €μž₯ν•˜μ—¬, κ³„μ‚°ν•œλ‹€.
8+
9+
Time Complexity:
10+
O(N):
11+
리슀트λ₯Ό 1번 μˆœνšŒν•˜λ©° 닡을 μ°ΎμœΌλ―€λ‘œ,
12+
O(N)의 μ‹œκ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
13+
14+
Space Complexity:
15+
O(N):
16+
forward λ°°μ—΄κ³Ό backward 배열에 N개의 μ›μ†Œλ₯Ό μ €μž₯ν•˜λ―€λ‘œ
17+
O(N)의 κ³΅κ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
18+
19+
Key takeaway:
20+
μŠ€μΊ”ν•˜μ—¬ 값을 μ €μž₯ν•΄λ‘λŠ” 방식을 μˆ™μ§€ν•˜μž.
21+
"""
22+
for_val = 1
23+
back_val = 1
24+
forward = []
25+
backward = []
26+
for i in range(len(nums)):
27+
forward.append(for_val)
28+
backward.append(back_val)
29+
30+
for_val *= nums[i]
31+
back_val *= nums[-(i + 1)]
32+
backward = backward[::-1]
33+
34+
answer = [forward[i] * backward[i] for i in range(len(nums))]
35+
return answer

β€Žreverse-bits/thispath98.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution:
2+
def reverseBits(self, n: int) -> int:
3+
"""
4+
Intuition:
5+
λΉ„νŠΈλ₯Ό μ—­μˆœμœΌλ‘œ μˆœνšŒν•œλ‹€.
6+
answerμ—λŠ” μ΅œλŒ€κ°’(2^31)λΆ€ν„° μ΅œμ†Œκ°’(2^0)으둜 κ°μ†Œν•˜λŠ”
7+
λ°©μ‹μœΌλ‘œ μ—…λ°μ΄νŠΈν•œλ‹€.
8+
9+
Time Complexity:
10+
O(N):
11+
n을 1번 μˆœνšŒν•˜λ©° 닡을 μ°ΎμœΌλ―€λ‘œ,
12+
O(N)의 μ‹œκ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
13+
14+
Space Complexity:
15+
O(1):
16+
answer에 값을 μ—…λ°μ΄νŠΈ ν•˜λ―€λ‘œ, μƒμˆ˜μ˜
17+
κ³΅κ°„λ³΅μž‘λ„κ°€ μ†Œμš”λœλ‹€.
18+
19+
Key takeaway:
20+
숫자λ₯Ό binary string으둜 λ§Œλ“œλŠ” bin() λ©”μ†Œλ“œλ₯Ό
21+
μ•Œκ²Œ λ˜μ—ˆλ‹€.
22+
"""
23+
answer = 0
24+
for i, bit in enumerate(bin(n)[2:][::-1]):
25+
answer += int(bit) * 2 ** (31 - i)
26+
return answer

β€Žtwo-sum/thispath98.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution:
2+
def twoSum(self, nums: List[int], target: int) -> List[int]:
3+
"""
4+
Intuition:
5+
기쑴에 ν’€μ—ˆλ˜ 3sum λ¬Έμ œμ™€ μœ μ‚¬ν•˜κ²Œ,
6+
ν•΄μ‹œμ— ν˜„μž¬ μˆ«μžμ™€ λ”ν•΄μ„œ target이 λ˜λŠ” 값을 μ°ΎλŠ”λ‹€.
7+
λ§Œμ•½ 없을 경우, ν•΄μ‹œμ— ν˜„μž¬ κ°’κ³Ό 인덱슀λ₯Ό μ €μž₯ν•œλ‹€.
8+
9+
Time Complexity:
10+
O(N):
11+
ν•΄μ‹œλŠ” μ ‘κ·Όν•˜λŠ” 데에 O(1)이 μ†Œμš”λ˜κ³ ,
12+
총 N번 λ°˜λ³΅ν•΄μ•Ό ν•˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(N)이닀.
13+
14+
Space Complexity:
15+
O(N):
16+
μ΅œμ•…μ˜ 경우 ν•΄μ‹œμ— N개의 μˆ«μžμ™€ 인덱슀λ₯Ό μ €μž₯ν•΄μ•Ό ν•œλ‹€.
17+
"""
18+
complement_dict = {}
19+
for i, num in enumerate(nums):
20+
if target - num in complement_dict:
21+
return [complement_dict[target - num], i]
22+
else:
23+
complement_dict[num] = i

0 commit comments

Comments
Β (0)