|
1 | 1 | """
|
2 |
| -Inputs: |
| 2 | +Inputs: 정수 배열 nums |
3 | 3 |
|
4 |
| -Outputs: |
| 4 | +Outputs: triplet 모음 배열 (중복 요소 X) |
5 | 5 |
|
6 |
| -Constraints: |
| 6 | +Constraints: 3 < = nums.length <= 3 * 10^3 |
| 7 | +-10^5 <= nums[i] <= 10^5 |
7 | 8 |
|
8 | 9 | Time Complexity:
|
9 | 10 |
|
10 |
| -Space Complexity: |
| 11 | +각 수들의 위치 다르면서, 합이 0이 되는 조합들의 모음 결과 |
| 12 | +n^3 은 안됨 |
11 | 13 |
|
| 14 | +하지만 가능한 모든 조합 구하기를 효율화 시키면 될듯? |
| 15 | +
|
| 16 | +x 0 1 2 3 4 5 |
| 17 | +0 [_,-1,0,1,-2,-5] |
| 18 | +1 [_,_,1,2,-1,-4] |
| 19 | +2 [_,_,_, |
| 20 | +3 |
| 21 | +4 |
| 22 | +5 |
| 23 | +
|
| 24 | +n^2 |
| 25 | +
|
| 26 | +
|
| 27 | +
|
| 28 | +0 [1 2] |
| 29 | +0 [1 3] |
| 30 | +0 [1 4] |
| 31 | +0 [1 5] |
| 32 | +
|
| 33 | +0 1 [2 3] |
| 34 | +0 1 [2 4] |
| 35 | +0 1 [2 5] |
| 36 | +
|
| 37 | +0 1 2[3 4] |
| 38 | +0 1 2[3 5] |
| 39 | +
|
| 40 | +0 1 2 3 [4 5] |
| 41 | +
|
| 42 | +우선 대괄호 안 두 수 합 사전 만들고, |
| 43 | +keys() 순회하며, |
| 44 | +key = a, b -> a보다 작은 수 for문 돌며 합 구하기? |
| 45 | +-> 그럼 시간복잡도 : O(n^3 보다 살짝 작은??) |
| 46 | +
|
| 47 | +하지만 이 풀이로는 중복 후보가 나옴.. |
| 48 | +
|
| 49 | +
|
| 50 | +Space Complexity: O(n^2) |
| 51 | +
|
| 52 | +대괄호 내 두 수 조합 만큼의 크기가 사전 크기 |
| 53 | +
|
| 54 | +# 1차 제출 코드 |
| 55 | +
|
| 56 | +from collections import defaultdict |
| 57 | +
|
| 58 | +class Solution: |
| 59 | + def threeSum(self, nums: List[int]) -> List[List[int]]: |
| 60 | + n = len(nums) |
| 61 | + v = defaultdict(int) |
| 62 | + ret = [] |
| 63 | + memo = set() |
| 64 | +
|
| 65 | + for i in range(1, n): |
| 66 | + for j in range(i + 1, n): |
| 67 | + v[(i, j)] = nums[i] + nums[j] |
| 68 | +
|
| 69 | + print(v) |
| 70 | + for key in v.keys(): |
| 71 | + a, b = key |
| 72 | + print('key: a, b', a, b) |
| 73 | +
|
| 74 | + for i in range(a): |
| 75 | + if nums[i] + v[key] == 0 and \ |
| 76 | + not (nums[i] in memo and nums[a] in memo and nums[b] in memo): |
| 77 | + print('sum zero!') |
| 78 | + memo.add(nums[i]) |
| 79 | + memo.add(nums[a]) |
| 80 | + memo.add(nums[b]) |
| 81 | + ret.append([nums[i], nums[a], nums[b]]) |
| 82 | +
|
| 83 | +
|
| 84 | +
|
| 85 | + return ret |
| 86 | +
|
| 87 | +테스트 케이스만 정답.. |
| 88 | +nums = |
| 89 | +[-1,0,1,2,-1,-4,-2,-3,3,0,4] 인 경우는 오답 |
| 90 | +
|
| 91 | +[회고] |
| 92 | +완탐, dp로 해봐도 안 풀리면 투 포인터 생각해보기! |
12 | 93 | """
|
13 | 94 |
|
| 95 | +class Solution: |
| 96 | + def threeSum(self, nums: List[int]) -> List[List[int]]: |
| 97 | + tuples = set() |
| 98 | + nums.sort() |
| 99 | + |
| 100 | + for i in range(len(nums) - 2): |
| 101 | + left, right = i + 1, len(nums) - 1 |
| 102 | + |
| 103 | + while left < right: |
| 104 | + three_sum = nums[i] + nums[left] + nums[right] |
| 105 | + if three_sum < 0: |
| 106 | + left += 1 |
| 107 | + elif three_sum > 0: |
| 108 | + right -= 1 |
| 109 | + else : |
| 110 | + tuples.add((nums[i], nums[left], nums[right])) |
| 111 | + left += 1 |
| 112 | + right -= 1 |
| 113 | + |
| 114 | + return list(tuples) |
| 115 | + |
0 commit comments