Skip to content

Commit 7bf58d1

Browse files
committed
feat: week2 - 3sum
1 parent 8ca22c5 commit 7bf58d1

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

โ€Ž3sum/Seoya0512.pyโ€Ž

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from typing import List
2+
3+
'''
4+
1์ฐจ ์‹œ๋„: ์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
5+
- nums์—์„œ ๋‘ ์ˆ˜ (A,B)๋ฅผ ๊ณ ๋ฅธ ํ›„, ์„ธ๋ฒˆ์งธ ์ˆซ์ž์ธ -(A+B)๊ฐ€ A,B๋ฅผ ์ œ์™ธํ•œ nums์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
6+
- ์ค‘๋ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด set๊ณผ sorted(tuple)์„ ํ™œ์šฉ
7+
8+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(N^3)
9+
- Outer loop์™€ Inner loop ๊ฐ๊ฐ O(N) ์ด๋ฏ€๋กœ O(N^2)์€ ๊ธฐ๋ณธ
10+
- nums[j:]์—์„œ third_num์„ ์ฐพ๋Š” ๋ฐ O(N) ์‹œ๊ฐ„์ด ๊ฑธ๋ ค์„œ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^3)
11+
12+
๊ณต๊ฐ„ ๋ณต์žก๋„: ์ตœ๋Œ€ O(N^2)
13+
- answer_set์€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” triplet์„ ์ €์žฅํ•˜๋ฉฐ, 3SUM ํŠน์„ฑ์ƒ ์œ ๋‹ˆํฌํ•œ triplet์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” O(N^2)
14+
15+
'''
16+
17+
class Solution:
18+
def threeSum(self, nums: List[int]) -> List[List[int]]:
19+
answer_set = set()
20+
21+
for i in range(len(nums) - 1):
22+
for j in range(i + 1, len(nums)):
23+
third_num = -1 * (nums[i] + nums[j])
24+
25+
if third_num in nums[j:]:
26+
answer_set.add(tuple(sorted([nums[i], nums[j], third_num])))
27+
28+
return [list(t) for t in answer_set]
29+
30+
'''
31+
๊ฐœ์„  : if third_num in nums[j:] ๋ถ€๋ถ„์„ set์„ ํ™œ์šฉ
32+
Approach
33+
- nums์—์„œ ๋‘ ์ˆ˜ (A,B)๋ฅผ ๊ณ ๋ฅธ ํ›„, ์„ธ๋ฒˆ์งธ ์ˆซ์ž์ธ -(A+B)๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ์กด ๊ธฐ์กฐ๋Š” ์œ ์ง€ํ•จ
34+
- (A,B) ์Œ ์ค‘ โ€˜A(์ฒซ ๋ฒˆ์งธ ์ˆซ์ž)โ€™๊ฐ€ ๋™์ผํ•œ ๊ฐ’์ผ ๋•Œ,
35+
์ด๋ฏธ ๋™์ผํ•œ first ๊ฐ’์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  triplet์„ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ
36+
๋‹ค์‹œ ๊ฐ™์€ first๋กœ ์‹œ์ž‘ํ•˜๋Š” ์กฐํ•ฉ์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ํ™œ์šฉ
37+
- seen set์„ ํ™œ์šฉํ•ด์„œ (A,B)๊ฐ€ ๊ณ ์ •๋œ ์ดํ›„ ์„ธ๋ฒˆ์งธ ์ˆซ์ž์ธ -(A+B)๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ O(1) ์‹œ๊ฐ„์— ํ™•์ธ
38+
39+
- (์˜ˆ์‹œ) seen set์€ i๊ฐ€ ๊ณ ์ •๋œ ์ดํ›„ j๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ nums[j] ๊ฐ’์„ ์ €์žฅ
40+
- nums = [a, b, c, d, e]
41+
- i = 0 (nums[i] = a)์ผ ๋•Œ, seen = {}
42+
- j = 1 (nums[j] = b)์ผ ๋•Œ, seen = {b}
43+
- j = 2 (nums[j] = c)์ผ ๋•Œ, seen = {b, c}
44+
- j = 3 (nums[j] = d)์ผ ๋•Œ, seen = {b, c, d}
45+
- j = 4 (nums[j] = e)์ผ ๋•Œ, seen = {b, c, d, e)
46+
47+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(N^2)
48+
- Outer loop์™€ Inner loop ๊ฐ๊ฐ O(N) ์ด๋ฏ€๋กœ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)
49+
50+
๊ณต๊ฐ„ ๋ณต์žก๋„: ์ตœ๋Œ€ O(N^2)
51+
- seen set์€ nums[j]๋ฅผ ์ €์žฅํ•˜๋ฉฐ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N)
52+
- used_first๋„ distinct first ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๋ฉฐ ์ตœ๋Œ€ O(N)
53+
- answer_set์€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” triplet์„ ์ €์žฅํ•˜๋ฉฐ, 3SUM ํŠน์„ฑ์ƒ ์œ ๋‹ˆํฌํ•œ triplet์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” O(N^2)
54+
'''
55+
class Solution:
56+
def threeSum(self, nums: List[int]) -> List[List[int]]:
57+
answer_set = set()
58+
n = len(nums)
59+
60+
used_first = set() # ์ด๋ฏธ i๋กœ ์‚ฌ์šฉํ•œ ๊ฐ’๋“ค
61+
62+
for i in range(n - 1):
63+
# ๊ฐ™์€ ๊ฐ’์„ ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž๋กœ ํ•œ ๋ฒˆ๋งŒ ์“ฐ๊ธฐ
64+
if nums[i] in used_first:
65+
continue
66+
used_first.add(nums[i])
67+
68+
seen = set()
69+
for j in range(i + 1, n):
70+
third_num = -1 * (nums[i] + nums[j])
71+
72+
if third_num in seen:
73+
triplet = tuple(sorted([nums[i], nums[j], third_num]))
74+
answer_set.add(triplet)
75+
else:
76+
seen.add(nums[j])
77+
78+
return [list(t) for t in answer_set]

0 commit comments

Comments
ย (0)