forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhaklee.py
More file actions
76 lines (68 loc) ยท 4.43 KB
/
haklee.py
File metadata and controls
76 lines (68 loc) ยท 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""TC: O(n^2), SC: O(n^2)
์์ด๋์ด:
- ํฉ์ด 0(์ฆ, ๊ณ ์ ๊ฐ)์ด ๋๋ ์ธ ์๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ฌธ์ .
- ์ธ ์ ์ค ํ๋๊ฐ ๊ณ ์ ๋์ด ์๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ์ซ์๋ค์ด ๋ค์ด์๋ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์๋ค๋ฉด ํฌ ํฌ์ธํฐ ์ฌ์ฉ ๊ฐ๋ฅ.
- ํฌ ํฌ์ธํฐ ํ
ํฌ๋์ ๊ฒ์ํ๋ฉด ๋ง์ด ๋์ค๋ฏ๋ก ์์ฃผ ์์ธํ ์ค๋ช
์ ์๋ตํ๊ฒ ๋ค.
- ์ด ๋ฌธ์ ์์๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์์ ๊ฐ๊ณผ ๊ฐ์ฅ ํฐ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด ๋ ๊ฐ์ ํฉ์ด
- ์ํ๋ ๊ฒฐ๊ณผ๋ณด๋ค ์์ผ๋ฉด ์์ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ํฐ ์ชฝ์ผ๋ก ์ฎ๊ธฐ๊ณ ,
- ์ํ๋ ๊ฒฐ๊ณผ๋ณด๋ค ํฌ๋ฉด ํฐ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์์ ์ชฝ์ผ๋ก ์ฎ๊ธด๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ ์ํ๋ ์์ ์ฐพ๋ ๊ฒ์ด ๊ด๊ฑด.
- ๊ณ ์ ๋ ์ซ์๋ฅผ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์์ ๊ฐ๋ถํฐ ํฐ ๊ฐ์ผ๋ก ํ๋์ฉ ์ฎ๊ฒจ๊ฐ๋ฉด ์ค๋ณต ์์ด ํ์์ด ๊ฐ๋ฅํ๋ค.
- ์ด๋ ํฌ ํฌ์ธํฐ๋ฅผ ์ธ ๊ตฌ๊ฐ์ ๊ณ ์ ๋ ์ซ์ ๋ค์ ์ค๋ ์ซ์๋ค๋ก ๋๋ค.
- ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ์ด ์ดํด๊ฐ ๋ ๋น ๋ฅผ ๊ฒ์ด๋ค..
SC:
- ์์ธํ ์ค๋ช
์ TC ๋ถ์์์ ํ์ธ ๊ฐ๋ฅ.
- ์ข
ํฉํ๋ฉด O(n^2).
TC:
- nums๋ฅผ sortํ๋ ๊ณผ์ ์์ O(n * log(n))
- ์ ๋ ฌ๋ nums๋ฅผ ๋ชจ๋ ์ํ.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ํ๋ง๋ค n-1, n-2, ..., 2 ํฌ๊ธฐ์ ๊ตฌ๊ฐ์์ ํฌ ํฌ์ธํฐ ์ฌ์ฉ.
- ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋จ์ ์ฌ์น์ฐ์ฐ ๋ฐ ๋น๊ต์ฐ์ฐ๋ง ์ฌ์ฉํ๋ฏ๋ก O(1).
- ํฌ ํฌ์ธํฐ ์ฌ์ฉ์ ๋งค ๊ณ์ฐ๋ง๋ค ํฌ์ธํฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ 1์ฉ ์ค์ด๋ ๋ค(s๊ฐ ์ฌ๋ผ๊ฐ๋ e๊ฐ ๋ด๋ ค๊ฐ๋ ).
- (SC) ๋งค ๊ณ์ฐ๋ง๋ค ์ต๋ ํ ๋ฒ solution์ ์ถ๊ฐํ๋ ์ฐ์ฐ์ ํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ ์ํ๋ง๋ค C * (n-1), C * (n-2), ..., C * 1์ ์๊ฐ์ด ๋ค์ด๊ฐ.
- (SC) ๋น์ทํ๊ฒ, ๋งค ์ํ๋ง๋ค ์์ ๊ฐ์ ๊ผด๋ก solution ๊ฐ์๊ฐ ๋ํด์ง ์ ์๋ค.
- ์ข
ํฉํ๋ฉด O(n^2)
- ์ด O(n^2)
"""
from collections import Counter
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
# ์ปคํ
. ์ด์ฐจํผ ์ธ ์์ ์ซ์์ ๋ฑ์ฅํ ์ ์๋ ๊ฐ์ ์ซ์ ๊ฐ์๊ฐ ์ต๋ 3๊ฐ์ด๋ฏ๋ก,
# ์ฒ์ ์ฃผ์ด์ง nums์ ๊ฐ์ ์ซ์๊ฐ ๋ค ๋ฒ ์ด์ ๋ฑ์ฅํ๋ฉด ์ธ ๋ฒ๋ง ๋์ค๋๋ก ๋ฐ๊ฟ์ค๋ค.
# ์ด ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ๊ฐ์ ์ซ์๊ฐ ๋ง์ด ๋ฐ๋ณต๋๋ ์ผ์ด์ค์์ ์๊ฐ ๊ฐ์ ์ด ์์ ์ ์๋ค.
# Counter ์ฐ๋ ๋ฐ์ O(n), ์๋ก tmp_nums ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ๋ฐ์ O(n)์ ์๊ฐ์ด ๋ค์ด๊ฐ๋ฏ๋ก
# ์ต์ข
์ ์ธ ์๊ฐ ๋ณต์ก๋์ ์ํฅ์ ์ฃผ์ง๋ ์๋๋ค.
tmp_nums = []
for k, v in Counter(nums).items():
tmp_nums += [k] * min(v, 3)
# ์ฌ๊ธฐ๋ถํฐ๊ฐ ์ฃผ๋ ๊ตฌํ.
sorted_nums = sorted(tmp_nums) # TC: O(n * log(n))
nums_len = len(tmp_nums)
sol = set()
for i in range(nums_len): # TC: O(n)
if i > 0 and sorted_nums[i] == sorted_nums[i - 1]:
# ์ปคํ
. ๊ณ ์ ๊ฐ์ด ์ด๋ฏธ ํ ๋ฒ ์ฌ์ฉ๋์๋ ๊ฐ์ด๋ฉด ์คํตํด๋ ๊ด์ฐฎ๋ค.
continue
s, e = i + 1, nums_len - 1
while s < e:
# ์ด while๋ฌธ ์ ์ฒด์์ TC O(n).
v = sorted_nums[s] + sorted_nums[e]
if v == -sorted_nums[i]:
# i < s < e ์ด๋ฏ๋ก, ์ด ์์๋๋ก ์ซ์๋ ์ ๋ ฌ๋ ์ํ๋ค.
# ์ฆ, ๊ฐ์ ๊ฐ์ ์ฌ์ฉํ ์์๋ง ๋ค๋ฅธ ์์ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค.
sol.add((sorted_nums[i], sorted_nums[s], sorted_nums[e]))
if v < -sorted_nums[i]:
# s, e์ ๋ ๊ฐ์ ๋ํ ๊ฒ์ด ์ํ๋ ๊ฐ๋ณด๋ค ์์ผ๋ฉด, ์์ ์ชฝ์ ์๋ ํฌ์ธํฐ๋ฅผ
# ๋ ํฐ ์ซ์๊ฐ ์๋ ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค.
# ์ฌ๊ธฐ์๋ ์ค๋ณต ๊ฐ ์ปคํ
์ ํ๋ ค๋ฉด ํ ์ ์๊ฒ ์ง๋ง, ์ด ์ปคํ
์ ์ ํ๋ ค๊ณ
# ๋งจ ์์์ ๊ฐ์ ์ซ์๋ค์ ๋ฏธ๋ฆฌ ์ต๋ํ ์ ๊ฑฐํด๋์๋ค.
s += 1
else:
# s, e์ ๋ ๊ฐ์ ๋ํ ๊ฒ์ด ์ํ๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด, ํฐ ์ชฝ์ ์๋ ํฌ์ธํฐ๋ฅผ
# ๋ ์์ ์ซ์๊ฐ ์๋ ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค.
# ์ฌ๊ธฐ์๋ ์ค๋ณต ๊ฐ ์ปคํ
์ ํ๋ ค๋ฉด ํ ์ ์๊ฒ ์ง๋ง, ์ด ์ปคํ
์ ์ ํ๋ ค๊ณ
# ๋งจ ์์์ ๊ฐ์ ์ซ์๋ค์ ๋ฏธ๋ฆฌ ์ต๋ํ ์ ๊ฑฐํด๋์๋ค.
e -= 1
return sol # ํ์
ํํธ๋ฅผ ๋ฐ๋ฅด์ง ์์๋ ์ ์ถ์ ๋๋ค...