Skip to content

Commit 351bb59

Browse files
committed
solutions
1 parent d9b42e7 commit 351bb59

File tree

5 files changed

+293
-0
lines changed

5 files changed

+293
-0
lines changed

โ€Žclimbing-stairs/haklee.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""TC: O(n), SC: O(1)
2+
3+
์•„์ด๋””์–ด:
4+
๊ณ„๋‹จ์˜ k๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ f(k)๋ผ๊ณ  ํ•˜์ž.
5+
f(k)๋Š” ๋‹ค์Œ์˜ ๋‘ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ํ•œ ๊ฐ’์ด๋‹ค.
6+
- k-2๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐ„ ๋‹ค์Œ ๋‘ ์นธ ๋œ€. ์ฆ‰, f(k-2)
7+
- k-1๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐ„ ๋‹ค์Œ ๋‘ ์นธ ๋œ€. ์ฆ‰, f(k-1)
8+
์ฆ‰, f(k) = f(k-2) + f(k-1)
9+
10+
11+
SC:
12+
- tabulation ๊ณผ์ •์—์„œ ๊ฐ’ 2๊ฐœ๋งŒ ๊ณ„์† ์œ ์ง€ํ•œ๋‹ค.
13+
- ์ฆ‰, O(1).
14+
15+
TC:
16+
- ๋‹จ์ˆœ ๋ง์…ˆ ๊ณ„์‚ฐ(O(1))์„ O(n)๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
17+
- ์ฆ‰, O(n).
18+
"""
19+
20+
21+
class Solution:
22+
def climbStairs(self, n: int) -> int:
23+
a, b = 1, 1
24+
for _ in range(n - 1):
25+
a, b = b, a + b
26+
return b

โ€Žcoin-change/haklee.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""TC: O(m*n), SC: O(n)
2+
3+
coin ์ข…๋ฅ˜: m
4+
amount ํฌ๊ธฐ: n
5+
6+
์•„์ด๋””์–ด:
7+
๊ฐ’ k๋ฅผ ๋งŒ๋“ค๋•Œ ํ•„์š”ํ•œ ์ตœ์†Œ ๋™์ „์˜ ์ˆ˜๋ฅผ f(k)๋ผ๊ณ  ํ•˜์ž.
8+
f(k)๋Š” ๋‹ค์Œ์˜ ๊ฒฝ์šฐ ์ค‘ ์ œ์ผ ์ž‘์€ ๊ฐ’์ด๋‹ค.
9+
- ๋™์ „ c1์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. f(k-c1) + 1๊ฐœ์˜ ๋™์ „ ํ•„์š”.
10+
- ๋™์ „ c2์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. f(k-c2) + 1๊ฐœ์˜ ๋™์ „ ํ•„์š”.
11+
- ...
12+
- ๋™์ „ cm์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. f(k-cm) + 1๊ฐœ์˜ ๋™์ „ ํ•„์š”.
13+
์ฆ‰, f(k) = min(f(k-c1), f(k-c2), ..., f(k-cm)) + 1
14+
15+
์ด๋•Œ, n๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  i์— ๋Œ€ํ•ด์„œ ํ•œ ๋ฒˆ f(i)๊ฐ’์„ ๊ณ„์‚ฐํ•  ์ผ์ด ์žˆ์—ˆ์œผ๋ฉด ์ด๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ
16+
์ ‘๊ทผํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
17+
18+
SC:
19+
- n๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  i์— ๋Œ€ํ•ด f(i)๊ฐ’์„ ์ €์žฅํ•ด๋‘๋Š” ๋ฐฐ์—ด ํ•„์š”.
20+
- ์ฆ‰, O(n).
21+
22+
TC:
23+
- ๊ฐ f(i)๋งˆ๋‹ค ์ตœ์ดˆ ๊ณ„์‚ฐ์‹œ m๊ฐœ์˜ ์•„์ดํ…œ์„ list์— ๋„ฃ๊ณ  min๊ฐ’์„ ์ฐพ๋Š” ๊ณ„์‚ฐ์„ ํ•œ ๋ฒˆ ํ•œ๋‹ค. O(m).
24+
- ์ตœ์ดˆ ๊ณ„์‚ฐ์ด ์•„๋‹ ๊ฒฝ์šฐ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. O(1).
25+
- ๊ฐ f(i)๋Š” f(i+c1), f(i+c2), ..., f(i+cm)์„ ๊ณ„์‚ฐํ• ๋•Œ ํ˜ธ์ถœ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์— O(m) + O(1) + ... + O(1)
26+
๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฏ€๋กœ ์ข…ํ•ฉํ•˜๋ฉด O(m) + (m+1)*O(1) = O(m) ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
27+
- ์ด๋Ÿฌํ•œ f(i)๊ฐ’์ด ์ด n๊ฐœ ์žˆ๋‹ค. ์ฆ‰, O(m*n).
28+
"""
29+
30+
31+
class Solution:
32+
def coinChange(self, coins: List[int], amount: int) -> int:
33+
arr = [None for _ in range(amount + 1)] # None๊ฐ’์€ ์•„์ง ๊ณ„์‚ฐ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป.
34+
arr[0] = 0 # ์ดˆ๊ธฐํ™”
35+
36+
def dp(target):
37+
if arr[target] is None: # ๋งŒ์•ฝ ์•„์ง f(target)์ด ๊ณ„์‚ฐ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด
38+
# ๋ชจ๋“  ๋™์ „๋“ค c์— ๋Œ€ํ•ด f(target - c)๋Š” ๋‹ค์Œ์˜ ๊ฒฝ์šฐ๋“ค๋งŒ ์œ ํšจํ•˜๋‹ค.
39+
# - target์ด ๋™์ „ c์˜ ํฌ๊ธฐ ์ด์ƒ์€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
40+
# - ์•ž์„œ ๊ณ„์‚ฐํ•ด๋ณธ ๊ฒฐ๊ณผ ์ด ๊ธˆ์•ก target - c๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ๋ฌด์‹œ.
41+
# - ๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋œ ๊ฒฝ์šฐ f(x)์˜ ๊ฐ’์ด -1์ด๋‹ค.
42+
candidates = [
43+
v for c in coins if target - c >= 0 and (v := dp(target - c)) >= 0
44+
]
45+
# candidates์— ์œ ํšจํ•œ f(target - c)๊ฐ’์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด f(target)์€ -1์ด๋‹ค.
46+
# ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด candidates์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’ ์ค‘ ์ œ์ผ ์ ์€ ์ˆ˜์˜ ๋™์ „์„ ํ•„์š”๋กœ ํ•˜๋Š”
47+
# ๊ฒฝ์šฐ์— 1์„ ๋”ํ•œ ๊ฐ’์„ f(target)์— ๋„ฃ์–ด๋‘ .
48+
arr[target] = -1 if len(candidates) == 0 else min(candidates) + 1
49+
return arr[target]
50+
51+
return dp(amount)

โ€Žcombination-sum/haklee.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
"""TC: O(m^n), SC: O(m^n)
2+
3+
candidates์— ์žˆ๋Š” ๊ฐ’์˜ ๊ฐœ์ˆ˜: m
4+
target์˜ ํฌ๊ธฐ: n
5+
6+
์•„์ด๋””์–ด:
7+
candidates(์ดํ•˜ cands)์— ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ f(k)๋ผ๊ณ  ํ•˜์ž.
8+
f(k)๋Š” ๋‹ค์Œ์˜ ๊ฒฝ์šฐ๋“ค์„ ์ข…ํ•ฉํ•œ ๊ฒƒ์ด๋‹ค.
9+
- cands์— ์žˆ๋Š” c1์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ฆ‰, f(k-c1)์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์˜ ๋์— c1์„ ๋”ํ•จ.
10+
- cands์— ์žˆ๋Š” c2๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ฆ‰, f(k-c2)์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์˜ ๋์— c2์„ ๋”ํ•จ.
11+
...
12+
- cands์— ์žˆ๋Š” cm์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ํ•ด์„œ k๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ฆ‰, f(k-cm)์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์˜ ๋์— cm์„ ๋”ํ•จ.
13+
14+
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๋Š”, ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฐ์— ์ค‘๋ณต๋œ ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
15+
e.g.) candidates = [2, 3], target = 5
16+
f(2) = [[2]]
17+
f(3) = [[3]]
18+
์œ„์˜ ๊ฐ’์„ ํ™œ์šฉํ•ด์„œ f(5)๋ฅผ ๊ตฌํ•˜๋ฉด
19+
f(5) = [f(2)์˜ ๋ฐฉ๋ฒ•๋“ค์˜ ๋์— 3์„ ๋ถ™์ž„] + [f(3)์˜ ๋ฐฉ๋ฒ•๋“ค์˜ ๋์— 2๋ฅผ ๋ถ™์ž„]
20+
= [[2, 3]] + [[3, 2]]
21+
= [[2, 3], [3, 2]]
22+
23+
๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์— ๊ฐ™์€ ์•„์ดํ…œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐพ์•„์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.
24+
25+
์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” [2, 2, 3], [2, 3, 2], [3, 2, 2] ๊ฐ™์ด ๋“ค์–ด๊ฐ€๋Š” ์•„์ดํ…œ์˜ ์ˆœ์„œ๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ
26+
๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰์— ์ค‘๋ณต์„ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ, ๋งŒ์•ฝ ์ด๋“ค์„ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด๋Š” ๋ฌธ์ œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๋ฉด ์œ„์˜
27+
๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.
28+
29+
30+
SC:
31+
- ๋ฌธ์ œ ํŠน์„ฑ์ƒ f(i)์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋Š”
32+
- i๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์˜ ๊ธธ์ด๋Š” O(i).
33+
- cands์— 1์ด ์žˆ๊ณ  ์ด 1๋กœ ๊ฐ€๋“ ์ฑ„์šด ๋ฐฉ๋ฒ• [1, 1, ..., 1]์„ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.
34+
- cands์˜ ์ตœ์†Œ๊ฐ’์ด ์–ด๋–ค ์ƒ์ˆ˜ x๋ผ๊ณ  ํ•ด๋„ [x, x, ..., x]์—๋Š” i/x๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, O(i/x)๋Š” O(i).
35+
- ๊ฐ ๋ฐฉ๋ฒ•์— ๋“ค์–ด์žˆ๋Š” ์•„์ดํ…œ์€ m๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅ. [(c1, c2, ..., cm ์ค‘ ํ•˜๋‚˜), ..., (c1, c2, ..., cm ์ค‘ ํ•˜๋‚˜)]
36+
- ์ฆ‰, f(i)์—๋Š” O(m^i)๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
37+
- f(1), f(2), ..., f(n)์„ ๋‹ค ๋”ํ•˜๋ฉด O(m^1) + O(m^2) + ... + O(m^n) = O(m^n)์ด ๋œ๋‹ค.
38+
- ์ฆ‰, O(m^n).
39+
40+
TC:
41+
- ์œ„์˜ SC์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. O(m^n).
42+
"""
43+
44+
45+
class Solution:
46+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
47+
dp = [[] for _ in range(target + 1)] # ์ดˆ๊ธฐํ™”.
48+
dp[0] = [[]] # 0์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ฌด ์ˆซ์ž๋„ ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
49+
for cur in range(1, target + 1): # f(i)๋ฅผ 1๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•ด๋‚˜๊ฐ€๋ฉด์„œ ์ฑ„์šฐ๊ธฐ ์‹œ์ž‘.
50+
for cand in candidates:
51+
prev = cur - cand
52+
if prev >= 0:
53+
dp[cur] += [combi + [cand] for combi in dp[prev]]
54+
55+
# ๋งˆ์ง€๋ง‰์— ์ค‘๋ณต๋œ ๊ฒฝ์šฐ๋ฅผ ์ œ๊ฑฐํ•ด์ค€๋‹ค.
56+
return list(set([tuple(sorted(i)) for i in dp[target]]))
57+
58+
59+
"""
60+
์•„์ด๋””์–ด:
61+
์ค‘๊ฐ„์ค‘๊ฐ„ ๊ณ„์‚ฐํ•˜๋ฉด์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ f(i)๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ ์ปคํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
62+
๊ฐ ๋ฐฉ๋ฒ•์€ [c1, ...c1, c2, ..., c2, ... , cm, ..., m] ๊ผด์ด ๋˜๋Š”๋ฐ,
63+
[ ^ ^ ... ^ ]
64+
๊ฐ f(i)๋งˆ๋‹ค ์œ„์˜ `^` ํ‘œ์‹œ๋ฅผ ํ•ด๋‘” ๊ณณ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋งŒํผ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
65+
์ด ์ˆซ์ž๋Š” ๋Œ€๋žต (i choose m-1)์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
66+
67+
๊ทธ๋Ÿฌ๋ฏ€๋กœ SC์™€ TC ๋ชจ๋‘ O(n choose m) = O((n/m)^m)...?
68+
(ref: https://en.wikipedia.org/wiki/Binomial_coefficient#Bounds_and_asymptotic_formulas)
69+
"""
70+
71+
72+
class Solution:
73+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
74+
dp = [[] for _ in range(target + 1)]
75+
dp[0] = [[]]
76+
for cur in range(1, target + 1):
77+
for cand in candidates:
78+
prev = cur - cand
79+
if prev >= 0:
80+
dp[cur] += [combi + [cand] for combi in dp[prev]]
81+
dp[cur] = list(set([tuple(sorted(i)) for i in dp[cur]]))
82+
return list(set([tuple(sorted(i)) for i in dp[target]]))
83+
84+
85+
"""
86+
์•„์ด๋””์–ด:
87+
๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์ค‘๋ณต๋œ ๊ฒฝ์šฐ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋ง๊ณ , ์ฒ˜์Œ๋ถ€ํ„ฐ ์ค‘๋ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๋‹ค.
88+
๊ฐ ๋ฐฉ๋ฒ•๋งˆ๋‹ค ํ•ด๋‹น ๋ฐฉ๋ฒ•์—์„œ ์‚ฌ์šฉํ•œ ์ตœ๋Œ€ candidate ์ธ๋ฑ์Šค๋ฅผ ๋‹ฌ์•„๋‘๊ณ , ์ดํ›„ ํ•ด๋ฅผ ๊ตฌํ•  ๋•Œ๋Š” ํ•ด๋‹น
89+
์ธ๋ฑ์Šค ์ด์ƒ์˜ candidate๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์„œ๋ฅผ ๋‹ฌ์•„๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
90+
e.g.) candidate = [2, 5, 3]
91+
f(10)์— ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€
92+
- ([2, 2, 2, 2, 2], 0) : ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ ์ดํ›„์— 2, 5, 3 ์ „๋ถ€ ๋“ฑ์žฅ ๊ฐ€๋Šฅ.
93+
- ([5, 5], 1) : ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ ์ดํ›„์— 5, 3๋งŒ ๋“ฑ์žฅ ๊ฐ€๋Šฅ.
94+
- ([2, 5, 3], 2) : ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ ์ดํ›„์— 3๋งŒ ๋“ฑ์žฅ ๊ฐ€๋Šฅ.
95+
- ([2, 2, 3, 3], 2) : ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ ์ดํ›„์— 3๋งŒ ๋“ฑ์žฅ ๊ฐ€๋Šฅ.
96+
97+
SC์™€ TC๋Š” ๋ฐ”๋กœ ์œ„์—์„œ O(n choose m)์„ ๊ณ„์‚ฐํ•œ ๊ฒƒ๊ณผ ๊ฐ™์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
98+
"""
99+
100+
101+
class Solution:
102+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
103+
dp = [[] for _ in range(target + 1)]
104+
dp[0] = [([], 0)] # (๋ฐฉ๋ฒ•, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ candidate index ์ตœ์†Œ๊ฐ’) ์Œ.
105+
for cur in range(1, target + 1):
106+
for i in range(len(candidates)):
107+
prev = cur - candidates[i]
108+
if prev >= 0:
109+
dp[cur] += [
110+
(combi[0] + [candidates[i]], i)
111+
for combi in dp[prev]
112+
if i >= combi[1]
113+
]
114+
return [i[0] for i in dp[target]] # ๋ฐฉ๋ฒ•๋งŒ ์ถ”์ถœํ•ด์„œ ๋ฆฌํ„ดํ•œ๋‹ค.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""TC: O(n), SC: O(n)
2+
3+
์•„์ด๋””์–ด:
4+
๋‹ค์Œ์˜ ์„ธ ์ƒํ™ฉ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
5+
- 0์ด ๋‘˜ ์ด์ƒ ํฌํ•จ. ๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ’์ด 0์ด ๋œ๋‹ค.
6+
- 0์ด ํ•˜๋‚˜ ํฌํ•จ.
7+
- 0์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์—๋Š” nums์— ์žˆ๋Š” ์ˆซ์ž๋“ค ์ค‘ 0 ๋ง๊ณ  ๋‚˜๋จธ์ง€ ์ˆซ์ž๋“ค์„ ์ „๋ถ€ ๊ณฑํ•œ ๊ฐ’.
8+
- ๊ทธ ์™ธ ๋ชจ๋‘ 0.
9+
- 0์ด ํ•˜๋‚˜๋„ ์—†๋‹ค.
10+
- nums์— ์žˆ๋Š” ๋ชจ๋“  ์ˆซ์ž๋“ค์„ ๊ณฑํ•œ ๊ฐ’์„ p๋ผ๊ณ  ํ• ๋•Œ, ๊ฐ ์ธ๋ฑ์Šค i๋งˆ๋‹ค p๋ฅผ nums[i]๋กœ ๋‚˜๋ˆˆ ๊ฐ’.
11+
12+
๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๋จผ์ € nums์— ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ๋Œ๋ฉด์„œ
13+
- 0์ด ์•„๋‹Œ ์ˆซ์ž๋ฅผ ์ „๋ถ€ ๊ณฑํ•œ ๊ฐ’ p๋ฅผ ๋งŒ๋“ ๋‹ค.
14+
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
15+
16+
๊ทธ ๋‹ค์Œ
17+
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค์˜ ๊ธธ์ด๋ฅผ ๋ณด๊ณ  ์œ„์˜ ์„ธ ์ƒํ™ฉ ์ค‘ ํ•˜๋‚˜์— ๋Œ€์‘ํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
18+
19+
SC:
20+
- 0์ด ์•„๋‹Œ ์ˆซ์ž๋“ค์„ ๊ณฑํ•œ ๊ฐ’ p๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ O(1)
21+
- 0์ด ๋“ฑ์žฅํ•˜๋Š” ์ธ๋ฑ์Šค zero_ind๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ O(n)
22+
- ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•  ๊ฐ’ O(n)
23+
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
24+
25+
TC:
26+
- nums๊ฐ’์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ p, zero_ind๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ• ๋•Œ O(n)
27+
- ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•  ๊ฐ’ ๋งŒ๋“ค๋•Œ O(n)
28+
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
29+
"""
30+
31+
32+
class Solution:
33+
def productExceptSelf(self, nums: List[int]) -> List[int]:
34+
zero_ind = []
35+
p = 1
36+
for i, e in enumerate(nums):
37+
if e == 0:
38+
zero_ind.append(i)
39+
else:
40+
p *= e
41+
42+
sol = [0] * len(nums)
43+
if len(zero_ind) > 1:
44+
return sol
45+
elif len(zero_ind) == 1:
46+
sol[zero_ind[0]] = p
47+
return sol
48+
else:
49+
return [p // i for i in nums]

โ€Žtwo-sum/haklee.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""TC: O(n), SC: O(n)
2+
3+
์•„์ด๋””์–ด:
4+
๋งŒ์•ฝ nums์— ์žˆ๋Š” ์–ด๋–ค ์ˆซ์ž i์— ๋Œ€ํ•ด target - i๋„ nums ์•ˆ์— ์žˆ๋‹ค๋ฉด, ์ด ๋‘ ์ˆซ์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.
5+
๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
6+
7+
case 1) nums = [3, 3], target = 6
8+
- nums์— 3์ด ๋‘ ๋ฒˆ ๋‚˜์˜ค๋ฉด i๋„ 3์ด๊ณ  target - i๋„ 3์ธ๋ฐ, ๊ทธ๋Ÿผ ๊ฐ™์€ ์ˆซ์ž์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ
9+
๊ฐ€์ ธ์˜ค๋Š”๊ฐ€?
10+
case 2) nums = [2, 3, 4], target = 6
11+
- nums์— 3์ด ํ•˜๋‚˜๋ฐ–์— ์—†๋Š”๋ฐ, i = 3์ผ๋•Œ i๋„ nums ์•ˆ์— ์žˆ๊ณ , target - i = 3์ด๋ผ ์ด ๊ฐ’๋„ nums ์•ˆ์— ์žˆ๋‹ค.
12+
์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์•„์ดํ…œ์„ ๋”ํ•ด์„œ 6์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ [1, 1]๊ฐ™์€ ๋‹ต์„ ๋ฆฌํ„ดํ•˜๋ฉด ์˜ค๋‹ต์ด๋‹ค.
13+
14+
์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
15+
- nums์— ์žˆ๋Š” uniqueํ•œ ์ˆซ์ž์— ๋Œ€ํ•ด ๊ฐ ์ˆซ์ž์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ dict๋กœ ์ €์žฅํ•œ๋‹ค.
16+
- ๋งŒ์•ฝ nums์— ์†ํ•˜๋Š” ์–ด๋–ค ์ˆ˜ i์— ๋Œ€ํ•ด i์™€ target - i์˜ ๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ, nums ์•ˆ์— ์žˆ๋Š” i ์ค‘์— ์ œ์ผ ์•ž์— ์žˆ๋Š”
17+
i์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„์„œ ์•ž์„œ ๋งŒ๋“  dict์— ์žˆ๋Š” ์ธ๋ฑ์Šค์™€ ๋น„๊ตํ•ด์„œ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•œ๋‹ค.
18+
19+
Q) ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ i, target - i ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅผ๋•Œ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ nums ์•ˆ์— ๋‘ ๋ฒˆ ์ด์ƒ ๋“ฑ์žฅํ•˜๋ฉด ์–ด๋–กํ•˜์ง€...?
20+
A) ๊ทธ๋Ÿด ์ผ์€ ์—†๋‹ค. ์†”๋ฃจ์…˜์€ ์œ ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, i๋‚˜ target - i๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ๋‚˜์˜ค๋ฉด ์†”๋ฃจ์…˜์ด ๋‘˜ ์ด์ƒ์ด ๋จ.
21+
22+
23+
SC:
24+
- ind_dict๋ฅผ ๋งŒ๋“ค ๋•Œ๋ž‘ nums_set ๋งŒ๋“ค๋•Œ ๊ฐ๊ฐ O(n).
25+
- ์ฆ‰, O(n)
26+
27+
TC:
28+
- ind_dict๋ฅผ ๋งŒ๋“ค๋•Œ O(n).
29+
- nums_set์— ์žˆ๋Š” ๊ฐ’์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ˆœํšŒ, O(n)
30+
- ๋‚ด๋ถ€์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์€ O(1)
31+
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
32+
"""
33+
34+
35+
class Solution:
36+
def twoSum(self, nums: List[int], target: int) -> List[int]:
37+
# ๋จผ์ € nums์˜ ๊ฐ ์•„์ดํ…œ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
38+
# ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ๊ฒƒ์€, nums์— ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ๋‚˜์˜ค๋ฉด ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋“ค์–ด๊ฐ.
39+
ind_dict = {k: i for i, k in enumerate(nums)} # SC: O(n), TC: O(n)
40+
41+
# nums์— ์žˆ๋Š” uniqueํ•œ ๊ฐ’ i๋งˆ๋‹ค,
42+
for i in (nums_set := set(nums)): # SC: O(n), TC: O(n)
43+
# ๋งŒ์•ฝ target - i๋„ nums ์•ˆ์— ์žˆ๋‹ค๋ฉด,
44+
if target - i in nums_set:
45+
# ๊ทธ๋ฆฌ๊ณ  i์™€ target - i๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆซ์ž๋ผ๋ฉด,
46+
if i != target - i:
47+
# ์‰ฌ์šด ์ผ€์ด์Šค. ๊ทธ๋ƒฅ ๋‘ ์ˆซ์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„์„œ ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
48+
return [ind_dict[i], ind_dict[target - i]]
49+
50+
# ์—ฌ๊ธฐ์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด i์™€ target - i๊ฐ’์ด ๊ฐ™์Œ.
51+
if (x := nums.index(i)) != ind_dict[target - i]:
52+
# ์ฒซ, ๋งˆ์ง€๋ง‰ ๋“ฑ์žฅ ์ธ๋ฑ์Šค๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, ์ด ๋‘ ์ˆซ์ž๋ฅผ ๋ฆฌํ„ด.
53+
return [x, ind_dict[target - i]]

0 commit comments

Comments
ย (0)