앞뒤로 같은 값이 있을 경우, 이를 쉽게 처리하기 위해 먼저 sort() 함수를 사용해 정렬한다.
그림에서 i,j,k 각각의 포인터가 계속 이동하면서 i + j + k = 0 을 찾아낸다.
이 브루트 포스 풀이에는 중복된 값이 있을 수 있으므로 continue로 건너뛰도록 처리한다.
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
results = []
nums.sort()
#브루트 포스 n^3 반복
for i in range(len(nums)-2):
#중복된 값 건너뛰기
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in range(i+1, len(nums) - 1):
if j > i + 1 and nums[j] ==nums[j-1]:
continue
for k in range(j + 1, len(nums)):
if k > j + 1 and nums[k] == nums[k-1]:
continue
if nums[i] + nums[j] + nums[k] == 0:
results.append((nums[i], nums[j], nums[k]))
return results
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
results = []
nums.sort()
for i in range(len(nums) -2):
#중복된 값 건너뛰기
if i > 0 and nums[i] == nums[i-1]:
continue
#간격을 좁혀가며 합 sum 계산
left, right = i + 1, len(nums) - 1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum < 0:
#0보다 작으면 값 키우기
left += 1
elif sum > 0:
#0보다 크면 값 줄이기
right -= 1
else:
#sum = 0인 경우이므로 정답 및 동일한 값의 경우 스킵처리
results.append((nums[i],nums[left],nums[right]))
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return results