์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘ํ–‰๋ ฌ) DFS

2023. 11. 28. 11:10ใ†์ธํ”„๋Ÿฐ/์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„

728x90

 

https://hyejin.tistory.com/1262

 

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง

https://hyejin.tistory.com/1261 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง https://hyejin.tistory.com/1260 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree

hyejin.tistory.com

-> ์ด์ „ ๋ฌธ์ œ ํ’€์ด 

 

 

 

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

 

 

 

 

 

 

 

 

 

728x90

'์ธํ”„๋Ÿฐ > ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ (BFS)  (0) 2023.11.30
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘๋ฆฌ์ŠคํŠธ) DFS  (0) 2023.11.29
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ (BFS)  (0) 2023.11.27
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ (DFS)  (2) 2023.11.27
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ์†ก์•„์ง€ ์ฐพ๊ธฐ 1 (BFS : Breadth-First Search)  (1) 2023.11.24