๐ก๋ฌธ์ ๋ถ์ ์์ฝ
- ์ฃผ์ด์ง ๋ฐฐ์ด์์ ๊ธธ์ด๊ฐ 1 ์ด์์ธ ๋ชจ๋ ๋ถ๋ถ์์ด ์ค, ๊ทธ ํฉ์ด ํน์ ๊ฐ
S
๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ์์ผ ํ๋ค.
- ๋ฐฐ์ด
arr
์ ์ ์ S
๊ฐ ์ฃผ์ด์ง๋ค.
- ๋ฐฐ์ด์ ๋ชจ๋ ๋ถ๋ถ์์ด ์ค ํฉ์ด
S
๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
๐ก์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- ๋ถ๋ถ์์ด ํ์
๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ์ ํํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํด์ ๋ชจ๋ ๋ถ๋ถ์์ด์ ํ์ํด์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ์ ์๋
2^n
์ด๋ค.
- ๋ฐฑํธ๋ํน
๋ฐฐ์ด์ ์์๋ฅผ ํ๋์ฉ ์ ํํ๊ฑฐ๋ ์ ํํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ฌ๊ท์ ์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ ์ ์๋ค. ์ด๋, ๋ถ๋ถ์์ด์ ํฉ์ด
S
์ ๊ฐ์ผ๋ฉด ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- ๊ฒฝ์ฐ์ ์ ์นด์ดํ
๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ฉด์ ํฉ์ด
S
์ธ ๋ถ๋ถ์์ด์ ์นด์ดํธํ๋ค.
- ์์ธ ์ฒ๋ฆฌ
๊ณต์งํฉ์ ์ ์ธํ๊ณ ๊ธธ์ด๊ฐ 1 ์ด์์ธ ๋ถ๋ถ์์ด๋ง ๊ณ ๋ คํ๋ค.
๐ก์ฝ๋
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');
const [n, S] = input[0].split(' ').map(Number);
const arr = input[1].split(' ').map(Number);
let count = 0;
function dfs(index, sum) {
if (index === n) return;
sum += arr[index];
// ๋ถ๋ถ์์ด์ ํฉ์ด S์ ๊ฐ์์ง ํ์ธ
if (sum === S) count++;
// ํ์ฌ ์์๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ์ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์
dfs(index + 1, sum); // ํ์ฌ ์์๋ฅผ ํฌํจํ ๊ฒฝ์ฐ
dfs(index + 1, sum - arr[index]); // ํ์ฌ ์์๋ฅผ ํฌํจํ์ง ์์ ๊ฒฝ์ฐ
}
// ํ์ ์์
dfs(0, 0);
console.log(count);
๐ก์๊ฐ๋ณต์ก๋
- ๋ฐฐ์ด์ ๊ธธ์ด
n
์ ๋ํด 2^n
๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(2^n)์ด๋ค.
n
์ด ์ต๋ 20๊น์ง ๊ฐ๋ฅํ๋ฏ๋ก 2^20 = 1,048,576
๊ฐ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ์๊ฐ ๋ด์ ๊ฐ๋ฅํ๋ค.