(Python, Java) 리트코드 - 3 sum

[문제 링크]

풀이

from typing import List


class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        answer = []
        nums.sort()

        for i in range(len(nums) - 2):
            # 중복제거
            if i > 0 and nums[i] == nums[i - 1]:
                continue

            left, right = i + 1, len(nums) - 1

            while left < right:
                sum = nums[i] + nums[left] + nums[right]
                if sum < 0:
                    left += 1
                elif sum > 0:
                    right -= 1
                else:
                    answer.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 answer

if __name__ == '__main__':
    print(Solution().threeSum([-1, 0, 1, 2, -1, -4]))

투 포인터 문제인데 투포인터 문제는 아직 익숙치 않아서 생각하기 조금 어렵다.

Java 풀이

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int length = nums.length;
        Arrays.sort(nums);

        List<List<Integer>> answer = new ArrayList<>();
        for (int idx = 0; idx < length - 2; idx++) {
            
            // 중복 제거
            if (0 < idx && nums[idx - 1] == nums[idx])
                continue;

            int left = idx + 1;
            int right = length - 1;

            while (left < right) {
                int sum = nums[idx] + nums[left] + nums[right];
                if (sum > 0) {
                    right--;
                } else if (sum < 0) {
                    left++;
                } else {
                    answer.add(List.of(nums[idx], nums[left], nums[right]));
                    // 중복 제거
                    while (left < right && nums[left] == nums[left + 1])
                        left++;
                    while (left < right && nums[right] == nums[right - 1])
                        right--;

                    right--;
                    left++;
                }
            }
        }
        return answer;
    }
}

3개를 구해야 하므로 정렬시키고 1개를 기준으로 잡고 2개는 투포인터로 진행한다.
중복 처리하는 경우를 제거해줘야하는 것을 유의해야 한다.


© 2021. By Backtony