43165. ํ๊ฒ ๋๋ฒ
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ํ๊ฒ ๋๋ฒ
๋ฌธ์ ์ ํ | ๋์ด๋ | ๊ฑธ๋ฆฐ ์๊ฐ | ํด๊ฒฐ ์ ๋ฌด(โ /โ) |
---|---|---|---|
BFS/DFS | lv.2 | 30๋ถ | โ |
#
์ค๊ณ ๋ฐฉ๋ฒ์ซ์ ๋ฐฐ์ด๊ณผ ํ๊ฒ์ bfs ํจ์์ ๊ทธ๋๋ก ๋๊ธฐ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.
bfs ํจ์๋, ๋ฐ์ ์ซ์ ๋ฐฐ์ด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ (pop ์ฐ์ฐ์ด ์ฐธ์กฐํ array๋ฅผ ๋ชจ๋๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์)
๋ณต์ฌ๋ณธ์์ ๋ง์ง๋ง ์ซ์๋ฅผ ์ ๊ฑฐํ๊ณ ,
๋ง์ง๋ง ์ซ์๊ฐ ์ ๊ฑฐ๋ ๋ฐฐ์ด๊ณผ ๋ง์ง๋ง ์ซ์๋ฅผ ํ๊ฒ ๋๋ฒ์ +, - ์ฐ์ฐ์ ํ ๊ฒฐ๊ณผ๋ฅผ ํ๊ฒ ๋๋ฒ๋ก bfs ํจ์์ ๊ฐ๊ฐ ๋ณด๋ด๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด ๋ฐ๋๋ค.
bfs ํจ์๋ ์ซ์ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ผ ๋, ๋จ์ ์ซ์๊ฐ ํ๊ฒ ๋๋ฒ ๋๋ - ํ๊ฒ ๋๋ฒ์๊ฐ๋ค๋ฉด 1์ ๋ฆฌํดํ๋ค.
#
์ฝ๋- 1์ฐจ ํ์ด
function solution(numbers, target) { return bfs(numbers, target);}
function bfs(numbers, target) { const clone = [...numbers];
if (clone.length === 1) { return Number(clone[0] === target || clone[0] === -target); }
const lastNumber = clone.pop();
return bfs(clone, target - lastNumber) + bfs(clone, target + lastNumber);}
- 2์ฐจ ํ์ด
โ ๋ค์ ๋ณด๋ ์ด๊ฑด ๋จผ์ ์คํํ๋ ํจ์๋ถํฐ ๊น์ด ์ฐ์ ํ์ํ๊ธฐ ๋๋ฌธ์ dfs ์๋ค. ๊ทธ๋ฆฌ๊ณ
numbers.length === 0
์ผ ๋ ๊น์ง ๋ฐ๋ณตํ๋ ๊ฒ์ด ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋์๋ค. ๋ฐฐ์ด์ ์ฐธ์กฐํ์ด๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋ฐฐ์ด์ pop ํ๋ฉด ์๋ณธ ๋ฐฐ์ด๋ ๋ณํ๋ฏ๋ก๋ณต์ฌ๋ณธ์ ๋๊ฒจ์ฃผ์๋ค.
function solution(numbers, target) { return dfs(numbers, target);}
function dfs(numbers, target) { if (!numbers.length) { return target === 0 ? 1 : 0; }
const lastNumber = numbers.pop();
return ( dfs([...numbers], target - lastNumber) + dfs([...numbers], target + lastNumber) );}
#
์๊ฐ ๋ณต์ก๋- O(2^N)
#
์ด๋ ค์ ๋ ์ bfs ๋ฌธ์ ๊ฐ ์ฒ์์ด์ด์ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ๋ ๊ฒ์ด ์ฝ์ง ์์๋ค.
ํ ์คํธ ์ผ์ด์ค๊ฐ 1๊ฐ์ฌ์ ํ๋ค์๋ค.