๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿƒ algorithm/leetcode

LeetCode 494 - Target Sum (Medium)

by HandHand 2021. 3. 4.

๋ฌธ์ œ

LeetCode - 494๋ฒˆ

ํ’€์ด ๊ณผ์ •

์–‘์˜ ์ •์ˆ˜๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ + ์™€ - ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ํ•ฉ S ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 20 ์ด๊ณ  + ์™€ - ๋‘ ๊ฐ€์ง€๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ 2^20 ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ DFS ๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ์ ธ๋ด๋„ ๋˜์ง€๋งŒ DFS ๊ณผ์ •์—์„œ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ 
์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ๊ณ„ํš๋ฒ• ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

dp(x, sum) = ๋ฐฐ์—ด์˜ x ์œ„์น˜๋ถ€ํ„ฐ ์„ ํƒํ•ด์„œ ๊ทธ ํ•ฉ์ด sum์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ํ™”์‹์„ ์„ธ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dp(x, sum) = dp(x+1, sum + x) + dp(x+1, sum - x)


์ฝ”๋“œ

/**
 * @param {number[]} nums
 * @param {number} S
 * @return {number}
 */
var findTargetSumWays = function (nums, S) {
  const cache = new Map();

  function dp(x, sum) {
    if (x === nums.length) return sum === S ? 1 : 0;

    const key = `${x}#${sum}`;
    if (cache.has(key)) return cache.get(key);

    const result = dp(x + 1, sum + nums[x]) + dp(x + 1, sum - nums[x]);
    cache.set(key, result);
    return result;
  }

  const answer = dp(0, 0);
  return answer;
};
๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€