LeetCode 4Sum (JavaScript)

2025. 11. 17. 19:03·코딩테스트/LeetCode

링크 : https://leetcode.com/problems/4sum/submissions/1832172032/

문제 설명

더보기

Given an array nums of n integers, return an array of all the unique quadruplets [nums[a], nums[b], nums[c], nums[d]] such that:

  • 0 <= a, b, c, d < n
  • a, b, c, and d are distinct.
  • nums[a] + nums[b] + nums[c] + nums[d] == target

You may return the answer in any order.

Example 1:

Input: nums = [1,0,-1,0,-2,2], target = 0
Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

Example 2:

Input: nums = [2,2,2,2,2], target = 8
Output: [[2,2,2,2]]

Constraints:

  • 1 <= nums.length <= 200
  • 109 <= nums[i] <= 109
  • 109 <= target <= 109

문제 풀이

backtracking으로 문제를 접근 -> 시간 초과 발생 (더보기 클릭)

더보기

nums에서 1개씩 선택을 해가며 총 4개(selected)가 되었을 때 중복이 안된다면 answer에 추가하는 형식으로 backtracking을 구현

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
var fourSum = function(nums, target) {
    const answer = [];
    nums.sort((a, b) => a - b);

    const selected = [];
    const used = new Set();

    const backtracking = (index, sum, depth) => {
        if (sum === target && depth === 4) {
            if (!used.has(selected.join(''))) {
                used.add(selected.join(''));
                answer.push([...selected]);
            }
            return;
        }

        if (depth < 4 && nums.length - index < 4 - depth) {
            return;
        }

        for (let i = index; i < nums.length; i++) {
            selected.push(nums[i]);
            backtracking(i + 1, sum + nums[i], depth + 1);
            selected.pop(nums[i]);
        }
    }

    backtracking(0, 0, 0);

    return answer;
};

3Sum과 같은 문제 https://kuh97.tistory.com/entry/LeetCode-3Sum-JavaScript 참고

4sum -> (2개의 포인터 고정, 2개는 Two Pointer이용)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
var fourSum = function(nums, target) {
    const answer = [];
    nums.sort((a, b) => a - b);

    for (let i = 0; i < nums.length - 3; i++) {
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue;
        }
        for (let j = i + 1; j < nums.length - 2; j++) {
            if (j > i + 1 && nums[j] === nums[j - 1]) {
                continue;
            }

            let [left, right] = [j + 1, nums.length - 1];

            const sum = nums[i] + nums[j];

            while (left < right) {
                const total = sum + nums[left] + nums[right];

                if (total === target) {
                    answer.push([nums[i], nums[j], nums[left], nums[right]]);

                    while (left < right && nums[left] === nums[left + 1]) {
                        left++;
                    }

                    while (left < right && nums[right] === nums[right - 1]) {
                        right--;
                    }

                    left++;
                    right--;
                } else if (total < target) {
                    left++;
                } else {
                    right--;
                }
            }
        }
    }

    return answer;
};

결론

Backtracking으로 문제를 접근했지만 depth가 4이고 nums가 많아질 경우 최악의 경우 O(n^4)의 시간이 걸리게 됨

-> 3Sum 문제를 응용한 투 포인터 방식으로 접근하여 해결, O(n^3)의 시간 복잡도를 가짐

'코딩테스트 > LeetCode' 카테고리의 다른 글

LeetCode Generate Parentheses (JavaScript)  (0) 2025.11.17
LeetCode Remove Nth Node From End of List (JavaScript)  (0) 2025.11.17
LeetCode Letter Combinations of a Phone Number (JavaScript)  (0) 2025.11.17
LeetCode Container With Most Water (JavaScript)  (0) 2025.11.16
LeetCode Zigzag Conversion (JavaScript)  (0) 2025.11.16
'코딩테스트/LeetCode' 카테고리의 다른 글
  • LeetCode Generate Parentheses (JavaScript)
  • LeetCode Remove Nth Node From End of List (JavaScript)
  • LeetCode Letter Combinations of a Phone Number (JavaScript)
  • LeetCode Container With Most Water (JavaScript)
의현
의현
개발하는 하루
  • 의현
    UIHYEON
    의현
  • 링크

    • 김의현 포트폴리오
    • GitHub
    • LinkedIn
  • 전체
    오늘
    어제
    • 분류 전체보기 (212) N
      • 프론트엔드 (64) N
        • JavaScript (51)
        • HTML (3)
        • React (7) N
        • CSS (2)
        • CS (1)
      • 프로젝트 (19)
        • Portfolio 사이트 개발 (19)
      • 코딩테스트 (126) N
        • Binary Search (2)
        • bfs (Breadth-first s.. (4)
        • dfs (Deapth-first se.. (1)
        • Greedy (1)
        • Dynamic Programming (1)
        • two pointer (4)
        • 구현 (2)
        • LIS(Longest Increasi.. (0)
        • 문자열 (3)
        • 자료구조 (6)
        • 비트마스크 (2)
        • 수학 (2)
        • 프로그래머스 (61)
        • LeetCode (37) N
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
의현
LeetCode 4Sum (JavaScript)
상단으로

티스토리툴바