diff --git a/3sum/HodaeSsi.py b/3sum/HodaeSsi.py index 5bc0015c6..6b8d4a9ad 100644 --- a/3sum/HodaeSsi.py +++ b/3sum/HodaeSsi.py @@ -1,22 +1,21 @@ -# 시간복잡도 O(n^2), 공간복잡도 O(n^2) class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: - # key: 값, value: list((i, j)) - dic = {} - answer = set() + answerSet = set() + nums.sort() - # 이중 for문으로 모든 경우의 수를 구합니다. - for i in range(len(nums)): - for j in range(i+1, len(nums)): - if nums[i] + nums[j] in dic: - dic[nums[i] + nums[j]].append((i, j)) + for i in range(len(nums) - 2): + leftIdx = i + 1 + rightIdx = len(nums) - 1 + while leftIdx < rightIdx: + sum = nums[i] + nums[leftIdx] + nums[rightIdx] + if sum < 0: + leftIdx += 1 + elif sum > 0: + rightIdx -= 1 else: - dic[nums[i] + nums[j]] = [(i, j)] + answerSet.add((nums[i], nums[leftIdx], nums[rightIdx])) + leftIdx = leftIdx + 1 + rightIdx = rightIdx - 1 - for k in range(len(nums)): - for i, j in dic.get(-nums[k], []): - if i != k and j != k: - answer.add(tuple(sorted([nums[i], nums[j], nums[k]]))) - - return list(answer) - + return list(answerSet) +