Skip to content

[Leetcode] 18. 4Sum โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

์ฃผ์–ด์ค€ ๋ฐฐ์—ด์˜ ์š”์†Œ 4๊ฐœ์˜ ํ•ฉ์ด target์ด๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜์—ฌ๋ผ.

Solution โ€‹

3Sum๋ฌธ์ œ ํ’€์ด์™€ ๊ฐ™์Œ. (๋ฐ˜๋ณต๋ฌธ k๋ฅผ ์ถ”๊ฐ€ํ•จ)

JS CODE โ€‹

javascript
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
var fourSum = function(nums, target) {
  let answer = [],
    visited = new Set() // ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ key๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ set์„ ์ด์šฉ
  const numCnts = new Map() // ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ. ์Œ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•ด map์‚ฌ์šฉ

  // ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ˜๋ณต ๋กœ์ง : ๊ธฐ์กด์˜ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด +1, ์—†์œผ๋ฉด 1๋กœ ์ดˆ๊ธฐํ™”
  nums.forEach(num => {
    if (numCnts.has(num)) numCnts.set(num, numCnts.get(num) + 1)
    else numCnts.set(num, 1)
  })

  // ์ •๋ ฌ์„ํ•˜์—ฌ iterator๊ฐ€ ์ ‘๊ทผํ• ๋•Œ ๋‹ค์Œ์ˆ˜๊ฐ€ ๋ฌด์กฐ๊ฑด ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฅผ ์ด์šฉํ•จ.
  nums.sort((a, b) => a - b)

  for (let i = 0; i < nums.length; i++) {
    numCnts.set(nums[i], numCnts.get(nums[i]) - 1)  // ์‚ฌ์šฉ๋œ ์ˆซ์ž๋ฅผ ์นด์šดํŒ…

    for (let j = i + 1; j < nums.length; j++) {
      numCnts.set(nums[j], numCnts.get(nums[j]) - 1) // ์ž„์‹œ๋กœ ์‚ฌ์šฉ์ค‘์ธ ์ˆซ์ž๋ฅผ ์นด์šดํŒ… (-)

      for(let k = j + 1 ; k < nums.length; k++) {
        numCnts.set(nums[k], numCnts.get(nums[k]) - 1) // ์ž„์‹œ๋กœ ์‚ฌ์šฉ์ค‘์ธ ์ˆซ์ž๋ฅผ ์นด์šดํŒ… (-)

        const rest = parseInt(target-(nums[i] + nums[j] + nums[k])) // ํƒ€๊ฒŸ ์ˆซ์ž๋ฅผ ์ฐพ์Œ
        const tempArr = [nums[i], nums[j], nums[k], rest]
        // ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์ฒ˜๋ฆฌ : rest๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ 1์ด์ƒ์ธ ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธ, rest๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ํฐ ์ˆ˜๊ฐ€์™€์„œ ์ธ๋ฑ์Šค๊ฐ€ ๋’ค๋กœํƒ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€, ์ •๋‹ต ๋ฐฐ์—ด์— ๊ฐ™์€ ํ˜•์‹์ด ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธ
        if (numCnts.get(rest) && nums[k] <= rest && !visited.has(tempArr.toString())) {
          answer.push(tempArr)
          visited.add(tempArr.toString())
        }

        numCnts.set(nums[k], numCnts.get(nums[k]) + 1) // ์ž„์‹œ๋กœ ์‚ฌ์šฉ์ค‘์ธ ์ˆซ์ž๋ฅผ ์นด์šดํŒ… (+)
      }

      numCnts.set(nums[j], numCnts.get(nums[j]) + 1) // ์ž„์‹œ๋กœ ์‚ฌ์šฉ์ค‘์ธ ์ˆซ์ž๋ฅผ ์นด์šดํŒ… (+)
    }
  }
  return answer
}