Skip to content

Commit 45e2f8b

Browse files
authored
Merge pull request #380 from haklee/main
[haklee] week 3
2 parents 208ccc7 + 91a5c95 commit 45e2f8b

File tree

5 files changed

+393
-0
lines changed

5 files changed

+393
-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: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
"""TC: O(n), SC: O(1)
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+
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋‘˜ ์ด์ƒ์ธ์ง€ ์ฒดํฌํ•œ๋‹ค.
16+
17+
๊ทธ ๋‹ค์Œ
18+
- 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋‘˜ ์ด์ƒ์ธ์ง€, 0์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ๋ณด๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ด.
19+
20+
SC:
21+
- 0์ด ์•„๋‹Œ ์ˆซ์ž๋“ค์„ ๊ณฑํ•œ ๊ฐ’ p๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ O(1)
22+
- 0์ด ๋“ฑ์žฅํ•˜๋Š” ์ธ๋ฑ์Šค zero_ind์™€ ๋‘˜ ์ด์ƒ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ all_zero ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ O(1).
23+
- ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•  ๊ฐ’ O(n) <- ์ด๊ฑด ๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„์—์„œ ์ œ์™ธํ•œ๋‹ค.
24+
- ์ข…ํ•ฉํ•˜๋ฉด O(1).
25+
26+
TC:
27+
- nums๊ฐ’์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ p, zero_ind, all_zero๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ• ๋•Œ O(n)
28+
- ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•  ๊ฐ’ ๋งŒ๋“ค๋•Œ O(n)
29+
- ์ข…ํ•ฉํ•˜๋ฉด O(n).
30+
"""
31+
32+
33+
class Solution:
34+
def productExceptSelf(self, nums: List[int]) -> List[int]:
35+
all_zero = True
36+
zero_ind = None
37+
p = 1
38+
for i, e in enumerate(nums):
39+
if e == 0:
40+
if zero_ind is not None:
41+
break
42+
zero_ind = i
43+
else:
44+
p *= e
45+
else:
46+
all_zero = False
47+
sol = [0] * len(nums)
48+
if all_zero:
49+
return sol
50+
elif zero_ind is not None:
51+
sol[zero_ind] = p
52+
return sol
53+
else:
54+
return [p // i for i in nums]
55+
56+
57+
""" TC: O(n), SC: O(1)
58+
ํ•˜์ง€๋งŒ ์œ— ์†”๋ฃจ์…˜์€ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ํ•œ `/`(์ •ํ™•ํžˆ๋Š” `//`)๋ฅผ ์ผ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
59+
๋‚˜๋ˆ„๊ธฐ๋ฅผ ํ•˜์ง€ ๋ง๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ž˜ ์šฐํšŒํ•ด๋ณด์ž.
60+
61+
โ€ป ์ฃผ์˜: ์ •๋ฐ€ํ•œ ๊ณ„์‚ฐ์— ์ทจ์•ฝํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์—
62+
์ •๋ง ์ž์‹  ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
63+
64+
์•„์ด๋””์–ด:
65+
๋‹ค์Œ์˜ ๋“ฑ์‹์„ ๋ณด์ž.
66+
67+
x / y = 2^(log2(x)) / 2^(log2(y)) = 2^(log2(x)-log2(y))
68+
69+
์ฆ‰, ์šฐ๋ฆฌ๋Š” ๋‚˜๋ˆ„๊ธฐ ์—ฐ์‚ฐ์„ power, log, - ์—ฐ์‚ฐ์œผ๋กœ ์šฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
70+
71+
์œ„์˜ ์šฐํšŒ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.
72+
- ์›๋ž˜๋Š” p๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ nums์— ์žˆ๋Š” ๊ฐ’๋“ค ์ค‘ 0์ด ์•„๋‹Œ ๊ฒƒ๋“ค์„ ์ „๋ถ€ ๊ณฑํ•ด์คฌ๋‹ค.
73+
- ์ด์ œ p์—๋Š” 2^p์„ ๊ณ„์‚ฐํ–ˆ์„๋•Œ ๊ณฑ์…ˆ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ,
74+
p๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  p์—๋Š” nums์— ์žˆ๋Š” ๊ฐ’๋“ค ์ค‘ 0์ด ์•„๋‹Œ ๊ฐ’์— log๋ฅผ ์ทจํ•œ ๊ฐ’์„ ๋”ํ•ด์ค€๋‹ค.
75+
76+
ํ•˜์ง€๋งŒ 0์ดํ•˜์˜ ์‹ค์ˆ˜ x์— ๋Œ€ํ•ด์„œ๋Š” log(x)๊ฐ€ ์ •์˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
77+
๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•œ๋‹ค.
78+
- nums์— ์žˆ๋Š” ๊ฐ’ x๊ฐ€ 0์ด๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ„๋‹ค. ์ด๋Š” ๊ธฐ์กด์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค.
79+
- nums์— ์žˆ๋Š” ๊ฐ’ x๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ ˆ๋Œ€๊ฐ’์„ ์ทจํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์”Œ์šด๋‹ค.
80+
์ฆ‰, log(|x|)๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
81+
- ์ด ๊ฒฝ์šฐ ๊ฒฐ๊ณผ์—๋„ -1๋„ ๊ณฑํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ์ด ์ •๋ณด๋ฅผ
82+
`is_neg`๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜์ž.
83+
84+
์ฃผ์˜์ :
85+
์„ค๋ช…์— ๋“ฑ์žฅํ•˜๋Š” ๊ธฐํ˜ธ์™€ ์•„๋ž˜์˜ ์ฝ”๋“œ์— ๋“ฑ์žฅํ•˜๋Š” ๊ธฐํ˜ธ๋ฅผ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค.
86+
- ์œ„์—์„œ๋Š” power๋ฅผ `^`๊ธฐํ˜ธ๋กœ ์ผ์ง€๋งŒ python์—์„œ๋Š” `**`๊ธฐํ˜ธ๋ฅผ ์“ด๋‹ค.
87+
- ๊ทธ๋ฆฌ๊ณ  python์—์„œ `^`๊ธฐํ˜ธ๋Š” xor์„ ์˜๋ฏธํ•œ๋‹ค.
88+
89+
๋ฌธ์ œ์ :
90+
- ์œ„์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์ด๋ก ์ ์œผ๋กœ๋Š” ๋ฌธ์ œ๋  ๊ฒƒ์ด ์—†์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์ปดํ“จํ„ฐ๋ฅผ ํ†ตํ•œ ์—ฐ์‚ฐ์—์„œ๋Š”
91+
log๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฐ’์˜ ์†Œ์ˆ˜์  ๋’ท ์ž๋ฆฌ์ˆ˜๋“ค์ด ์ž˜๋ ค๋‚˜๊ฐ„๋‹ค.
92+
- ์ด๋กœ ์ธํ•ด 2^p๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด ๊น”๋”ํ•œ ์ •์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋”๋Ÿฌ์šด ์†Œ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ž˜์„œ
93+
์ด ์ˆซ์ž๊ฐ€ ์ •๋‹ต์— ๊ทผ์ ‘ํ•œ ๊ฐ’์ผ ๊ฒƒ์ด๋ผ๊ณ  ๊ตณ๊ฒŒ ๋ฏฟ๊ณ  ์—ฌ๊ธฐ์— `round` ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋ฐ˜์˜ฌ๋ฆผ์„
94+
ํ•ด์•ผ ์›ํ•˜๋Š” ๋‹ต์ด ๋‚˜์˜จ๋‹ค.
95+
- ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด nums์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๋“ค์— ๋กœ๊ทธ๋ฅผ ์ทจํ•˜๊ณ  ๋”ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด ์ž˜๋ฆฐ ์†Œ์ˆ˜์ 
96+
๊ฐ’๋“ค์ด ์ ์  ๋ˆ„์ ๋˜๋ฉด์„œ ์˜ค์ฐจ๊ฐ€ ์ ์  ์ปค์งˆ ๊ฒƒ์ด๋‹ค. ์˜ค์ฐจ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ปค์ง€๋ฉด 2^p๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฐ’์„
97+
๋ฐ˜์˜ฌ๋ฆผ ํ•˜๋”๋ผ๋„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ •ํ™•ํ•œ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
98+
- e.g.) nums = range(2, 18) ์ผ๋•Œ
99+
- expected answer: [177843714048000, 118562476032000, 88921857024000, 71137485619200, ...]
100+
- result: [177843714047999, 118562476031999, 88921857023999, 71137485619200, ...]
101+
- diff: [-1, -1, -1, 0, ...]
102+
- ๊ณฑํ•˜๋Š” ์ˆ˜์— ํฐ ์ˆ˜๊ฐ€ ์„ž์—ฌ๋„ ๋ฌธ์ œ๊ฐ€ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
103+
- e.g.) nums = [2, 10, 44444444444444] ์ผ๋•Œ
104+
- expected answer: [444444444444440, 88888888888888, 20]
105+
- result: [444444444444441, 88888888888888, 20]
106+
- diff: [1, 0, 0]
107+
- ๊ทธ๋ ‡๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ˆซ์ž๋ฅผ ๊ณฑํ•˜๊ฑฐ๋‚˜ ํฐ ์ˆซ์ž๋ฅผ ๊ณฑํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
108+
๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด ๋ฒ”์œ„ ๋‚ด์—์„œ ์œ„์˜ ๋ฐฉ๋ฒ•์ด ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์ด ๋ณด์žฅ๋˜๋Š”๊ฐ€?
109+
์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ท€์ฐฎ์€ ์ผ์ด๋‹ค...
110+
111+
๊ทธ๋Ÿฐ๋ฐ
112+
- ๋Œ€์ถฉ ๊ด€์ฐฐ์„ ํ•ด๋ณด๋‹ˆ ์ˆซ์ž๋“ค์˜ ๊ณฑ์ด ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์ธ `The product ... fit in a 32-bit integer.`
113+
๋ณด๋‹ค ํ›จ์”ฌ ํฐ ๊ฒฝ์šฐ์—๋งŒ ์œ„์˜ ์˜ค์ฐจ๊ฐ€ ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ์ค€๋‹ค.
114+
- ๊ทธ๋ž˜์„œ ์ผ๋‹จ ๋ฆฌํŠธ์ฝ”๋“œ์— ํ’€์ด๋ฅผ ๋˜์ ธ๋ณด์•˜๋”๋‹ˆ accept ๋˜์—ˆ๋‹ค. ๋‚˜๋Š” leetcodeํ”ผ์…œ ์ž˜ ํ’€์—ˆ๋‹ค๊ณ 
115+
๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
116+
- ๋งŒ์•ฝ ์ด ํ’€์ด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚˜ ๋ง๊ณ  ๋ฌธ์ œ ์กฐ๊ฑด์„ ์„ค๊ณ„ํ•œ ์‚ฌ๋žŒ๊ณผ ํ…Œ์ผ€๋ฅผ ๋งŒ๋“ 
117+
์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋Œ์„ ๋˜์ ธ๋ผ ยฏ\_(ใƒ„)_/ยฏ
118+
"""
119+
120+
import math
121+
122+
123+
class Solution:
124+
def productExceptSelf(self, nums: List[int]) -> List[int]:
125+
all_zero = True
126+
zero_ind = None
127+
p, is_neg = 0, False
128+
for i, e in enumerate(nums):
129+
if e == 0:
130+
if zero_ind is not None:
131+
break
132+
zero_ind = i
133+
else:
134+
is_neg ^= e < 0
135+
p += math.log2(abs(e))
136+
else:
137+
all_zero = False
138+
139+
sol = [0] * len(nums)
140+
if all_zero:
141+
return sol
142+
elif zero_ind is not None:
143+
sol[zero_ind] = round(2**p * (-1) ** (is_neg))
144+
return sol
145+
else:
146+
return [
147+
round(2 ** (p - math.log2(abs(i))) * (-1) ** (is_neg ^ (i < 0)))
148+
for i in nums
149+
]

โ€Ž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)