Skip to content

[Leetcode] 15. 3Sum โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

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

Solution โ€‹

  1. ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค. ์ฃผ์–ด์ง„ ์ˆ˜์˜๋Œ€ํ•˜์—ฌ ๊ฐ’์„ ์นด์šดํŒ…ํ•ด๋‘”๋‹ค.
  2. ์ˆœ์ฐจ์ ์œผ๋กœ ๋‘๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ์ฐพ์•„๋‚ธ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉํ•œ ์ˆซ์ž๋ฅผ ์นด์šดํŒ…์—์„œ ๋นผ์ค€๋‹ค.
  3. ๋‚˜๋จธ์ง€๊ฐ’์ด ์นด์šดํŒ…ํ•ด๋‘” ๊ฐ’์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์กด์žฌํ•˜๋ฉด ์ €์žฅ , ์ €์žฅํ•œ ๊ฐ’์„ ์ €์žฅ(๋ฐฐ์—ด์€ ์ฃผ์†Œ์ด๋ฏ€๋กœ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ” ์ €์žฅ)
  4. 2~3๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด์ „์— ์ €์žฅํ•ด๋‘” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

JS CODE โ€‹

javascript
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
  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) // ์ž„์‹œ๋กœ ์‚ฌ์šฉ์ค‘์ธ ์ˆซ์ž๋ฅผ ์นด์šดํŒ… (-)

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

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