2023. 11. 28. 11:10ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1262
-> ์ด์ ๋ฌธ์ ํ์ด
11. ๊ฒฝ๋ก ํ์ (์ธ์ ํ๋ ฌ)
์ค๋ช
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด 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
์ด 6 ๊ฐ์ง์ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ ์ ์ ์ N(1<=N<=20)์ ๊ฐ์ ์ ์ M๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์๋ถํฐ M์ค์ ๊ฑธ์ณ ์ฐ ๊ฒฐ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ด ๊ฐ์ง์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
5 9
1 2
1 3
1 4
2 1
2 3
2 5
3 4
4 2
4 5
์์ ์ถ๋ ฅ 1
6
๋ฌธ์ ํ์ด 1
public class RouteNavigation
{
static int n, m, cnt = 0;
static int[][] graph;
static int[] ch;
public int DFS(int v)
{
if (v == n) {
cnt++;
}else {
for (int i = 1; i <= n; i++)
{
if (graph[v][i] == 1 && ch[i] == 0) {
ch[i] = 1;
DFS(i);
ch[i] = 0; // ๋นฝํ ์์ ์์๋ 0์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํจ
}
}
}
return cnt;
}
public static void main(String[] args)
{
RouteNavigation routeNavigation = new RouteNavigation();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
graph = new int[n + 1][n + 1];
ch = new int[n + 1];
for (int i = 0; i < m; i++)
{
int a = scanner.nextInt();
int b = scanner.nextInt();
graph[a][b] = 1;
}
ch[1] = 1;
int result = routeNavigation.DFS(1);
System.out.println(result);
}
}
๐พ : ๋จผ์ ์ธ์ ํ๋ ฌ์ 2์ฐจ์ ๋ฐฐ์ด graph ๋ก ํธ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ch ๋ฐฐ์ด์ ํ๋ ๋ ๋ง๋ค๊ณ ํด๋น ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ์ฒดํฌํ๋ ๋ฐฐ์ด๋ก ์ฌ์ฉํ ๊ฒ์ด๋ค. (๋ฐฉ๋ฌธํ์ผ๋ฉด 1, ์๋๋ฉด 0)
ch[1] = 1;
int result = routeNavigation.DFS(1);
System.out.println(result);
๋งจ ์ฒ์ ๋ ธ๋ 1๋ถํฐ ์์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ch[1] = 1๋ก ์ฒดํฌํ๊ณ , ๊ทธ ๋ค์ DFS ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
public int DFS(int v)
{
if (v == n) {
cnt++;
}else {
for (int i = 1; i <= n; i++)
{
if (graph[v][i] == 1 && ch[i] == 0) {
ch[i] = 1;
DFS(i);
ch[i] = 0; // ๋นฝํ ์์ ์์๋ 0์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํจ
}
}
}
return cnt;
}
DFS ๋ฉ์๋์์๋ ์ด์ val ์ด n (๋ง์ง๋ง ๋ ธ๋)์ด๋ฉด cnt์ ๊ฐ์๋ฅผ +1 ํด์ฃผ๋ฉด ๋๊ณ , ์๋๋ฉด
for๋ฌธ์ 1๋ถํฐ n ๊น์ง ๋๋ฉด์ ์ฌ๊ท ํจ์๋ฅผ ์ํํด์ฃผ๋ฉด ๋๋ค.
์ด๋ graph[v][i] == 1 ์ด์ด์ผ ํ๊ณ , ๊ทธ ๋ค์ ch[i]๊ฐ ๋ฐฉ๋ฌธํ ์ ์ด ์์ด์ผ (0)
ch[i] = 1 ๋ก ๋ณ๊ฒฝํด์ (๋ฐฉ๋ฌธํ๋ค๊ณ ์ฒดํฌ), DFS(i) ๋ฅผ ๋ค์ ํธ์ถํ๋ค.
-> DFS(1) -> ch[2]๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ 1 ์ฒดํฌํ๊ณ , DFS(2) ๋ฅผ ํธ์ถํ๋ค.
-> DFS(2) ์์ ch[1], ch[2]๋ 1์ด๊ธฐ ๋๋ฌธ์ ch[3] ์ 1 ์ฒดํฌํ๊ณ , DFS(3) ํธ์ถํ๋ค.
-> DFS(3) ์์ ch[1], ch[2], ch[3] ์ 1์ด๋ฏ๋ก ch[4] ์ 1 ์ฒดํฌํ๊ณ , DFS(4) ํธ์ถํ๋ค.
-> DFS(4) ์์๋ ch[1], ch[2], ch[3], ch[4] ๋ 1์ด๋ฏ๋ก ch[5] ๋ฅผ ์ฒดํฌํ๊ณ DFS(5)๋ฅผ ํธ์ถํ๋ค.
-> DFS(5) ๋ v == n ์ ํด๋นํ๋ฏ๋ก cnt ++ ; ํด์ฃผ๊ณ ์ข ๋ฃํ๋ค. -> 1 2 3 4 5
-> DFS(3)์ผ๋ก ๋์์์ graph[3][5] 1์ด ์๋๋ฏ๋ก DFS(3) ๋ ์ข ๋ฃํ๋ค.
-> DFS(2) ๋ก ๋์์์ graph[2][4], graph[2][5] ๋ฅผ ๋ณผ ๋ graph[2][5] = 1 ์ด๋ฏ๋ก DFS(5)๋ฅผ ํธ์ถํ๋ค.
-> DFS(5) ๋ v == n ์ ํด๋นํ๋ฏ๋ก cnt ++; ํด์ฃผ๊ณ ์ข ๋ฃํ๋ค. -> 1 2 5
(์ข ๋ฃํ ๋๋ ์ด์ ๋ฐฉ๋ฌธ ํด์ ๋ฅผ ํด์ฃผ๊ธฐ ์ํด ch[i] = 0 ์ ํด์ค์ผ ํ๋ค.)
-> ๊ทธ๋ฆฌ๊ณ ๋ค์ DFS(1) ๋ก ๋์์์ 2๋ ํ์ผ๋ DFS(3) ์ ํธ์ถํ๋ค.
์ด๊ฑธ ๊ณ์ ๋ฐ๋ณตํด์ฃผ๋ฉด ๋จ..!
1 2 3 4 5
1 2 5
1 3 4 2 5
1 3 4 5
1 4 2 5
1 4 5