๐ section09 - 3 - ๊ฒฝ๋ก ํ์(์ธ์ ๋ฆฌ์คํธ)
๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด 1๋ฒ ์ ์ ์์ N
๋ฒ ์ ์ ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๊ฐ์ง ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฌธ์ ๋ค. ์๋ฅผ ๋ค์ด 1๋ฒ ์ ์ ์์ 5๋ฒ ์ ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ง ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
1 2 3 4 5
1 2 5
1 3 4 2 5
1 3 4 5
1 4 2 5
1 4 5
์ด์ ๊ณผ ๋์ผํ ๋ฌธ์ ์ง๋ง ์ด๋ฒ์๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํด์ ํธ๋ ๋ฌธ์ ๋ค. ๋ง์ฝ์ ๊ทธ๋ํ๋ฅผ ์ด์ฉํ ๋ฌธ์ ์์ ์ ์ ์ ๊ฐ์๊ฐ 10,000
๊ฐ ์ด์์ด๋ผ๋ฉด ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์.(์ธ์ ํ๋ ฌ์ ์ ์ ์ ๊ฐ์๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค.) ์ด ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก DFS
๋ฅผ ์ด์ฉํด์ ํ ์ ์๋ค. ๊ฒฝ๋ก์ ๊ฐ์ง์๋ง ์ถ๋ ฅํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๋ํ๋์ง ์๊ธฐ ์ํด path
๋ณ์๋ฅผ ์ถ๊ฐํ๋ค.
- ์ธ์ ๋ฆฌ์คํธ์ ๋ฐ๋ณต๋ฌธ์ ๋ฒ์๋
graph[v].length
๊น์ง - ์ธ์ ํ๋ ฌ์ฒ๋ผ ์ ์ ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ ์์
(
graph[v][i]===1
)์ด ํ์ ์๋ค. ์๋ํ๋ฉด ์ธ์ ๋ฆฌ์คํธ๋ ์ ์ ๋ผ๋ฆฌ ์ด๋ฏธ ์ฐ๊ฒฐ๋ ๊ฐ๋ง ๋ฃ๊ธฐ ๋๋ฌธ์ด๋ค. ๋์visited
๋ฐฐ์ด๋ก ๋ฐฉ๋ฌธํ๋์ง ์ฌ๋ถ๋ง ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๋ฉด ๋๋ค. - ๋ค์ DFSํจ์๋ฅผ ์คํํ ๋๋
DFS(graph[v][i])
๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
let n = 5;
let m = 9;
let arr = [
[1, 2],
[1, 3],
[1, 4],
[2, 1],
[2, 3],
[2, 5],
[3, 4],
[4, 2],
[4, 5],
];
console.log(solution(n, m, arr));
function solution(n, m, arr){
let graph = Array.from(Array(n+1), () => Array());
let visited = Array.from({length: n+1}, () => 0);
let cnt=0;
let path=[];
for (let [a, b] of arr) graph[a].push(b); // ์ธ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
function dfs(v){
if (v === n){
console.log(path);
cnt++;
}else{
for (let i=0; i<graph[v].length; i++){
if (!visited[graph[v][i]]){
visited[graph[v][i]]=1;
path.push(graph[v][i])
dfs(graph[v][i]);
visited[graph[v][i]]=0;
path.pop()
}
}
}
}
path.push(1);
visited[1]=1;
dfs(1);
return cnt;
}
๐๐ฝ
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 5 ]
[ 1, 3, 4, 2, 5 ]
[ 1, 3, 4, 5 ]
[ 1, 4, 2, 5 ]
[ 1, 4, 5 ]
6
๋๊ธ