[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
}