|
| 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