[Leetcode] 15. 3Sum โ
Problem โ
์ฃผ์ด์ค ๋ฐฐ์ด์ ์์ 3๊ฐ์ ํฉ์ด 0์ด๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๊ตฌํ์ฌ๋ผ.
Solution โ
- ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ์ฃผ์ด์ง ์์๋ํ์ฌ ๊ฐ์ ์นด์ดํ ํด๋๋ค.
- ์์ฐจ์ ์ผ๋ก ๋๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ๋๋จธ์ง ๊ฐ์ ์ฐพ์๋ธ๋ค. ์ด๋ ์ฌ์ฉํ ์ซ์๋ฅผ ์นด์ดํ ์์ ๋นผ์ค๋ค.
- ๋๋จธ์ง๊ฐ์ด ์นด์ดํ
ํด๋ ๊ฐ์ ์กด์ฌํ๋์ง ํ์ธํ๋ค.
- ์กด์ฌํ๋ฉด ์ ์ฅ , ์ ์ฅํ ๊ฐ์ ์ ์ฅ(๋ฐฐ์ด์ ์ฃผ์์ด๋ฏ๋ก ๋ฌธ์์ด๋ก ๋ฐ๊ฟ ์ ์ฅ)
- 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
}