문제 링크 (opens new window)

# 문제 설명

  1. 3 수의 합이 0이 되는 수 조합을 리턴하는 문제
  2. 오름차순 정렬, 순회하는 요소 하나를 고정하고 투포인터 문제로 변경
  3. 최종 복잡도는 O(N^2)
  4. 오름차순 정렬이 되어있으므로 선택된 요소 합이 0보다 작으면 왼쪽 포인터를 한칸 오른쪽으로 이동하여 합 값을 키운다.
  5. 동일한 로직으로 선택된 요소 합이 0보다 크면 오른쪽 포인터를 한칸 왼쪽으로 이동하여 합 값을 줄인다.
class Solution {
    func threeSum(_ nums: [Int]) -> [[Int]] {
        var sortedNums = nums.sorted()
        var result: Set<[Int]> = .init()

        for i in 0..<sortedNums.count {
            var left = i + 1
            var right = sortedNums.count - 1

            while(left < right) {
                let sum = sortedNums[i] + sortedNums[left] + sortedNums[right]
                if sum == 0 {
                    result.insert([
                        sortedNums[i],
                        sortedNums[left],
                        sortedNums[right]
                    ])
                    left += 1
                    right -= 1
                } else if sum < 0 {
                    left += 1
                } else {
                    right -= 1
                }
            }
        }
        return Array(result)
    }
}