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

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

728x90

 

https://hyejin.tistory.com/1263

 

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

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

hyejin.tistory.com

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

 

 

 

 

12. ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘ ๋ฆฌ์ŠคํŠธ) 

์„ค๋ช…

๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด 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_list
{
   static int n, m, answer = 0;
   static ArrayList<ArrayList<Integer>> graph;
   static int[] ch;

   public int DFS(int v) {

      if (v == n) {
         answer++;
      }else {
         for (int nv : graph.get(v)) {
            if (ch[nv] == 0) {
               ch[nv] = 1;
               DFS(nv);
               ch[nv] = 0;
            }
         }
      }

      return answer;
   }

   public static void main(String[] args)
   {
      RouteNavigation_list routeNavigationList = new RouteNavigation_list();
      Scanner scanner = new Scanner(System.in);
      n = scanner.nextInt();
      m = scanner.nextInt();
      graph = new ArrayList<>();
      for (int i = 0; i <= n; i++) { // get(5) ๊นŒ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ n๊นŒ์ง€ ๋ฐ˜๋ณต
         graph.add(new ArrayList<>()); // ์ •์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ Arraylist ๊ฐ์ฒด ์ €์žฅ
      }
      ch = new int[n+1];

      for (int i = 0; i < m; i++) {
         int a = scanner.nextInt();
         int b = scanner.nextInt();
         graph.get(a).add(b);
      }

      ch[1] = 1;
      int result = routeNavigationList.DFS(1);
      System.out.println(result);
   }
}

๐Ÿ‘พ : ์ด์ „ ๋ฌธ์ œ ํ’€์ด์—์„œ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋Š”๋ฐ ์‚ฌ์‹ค ์ธ์ ‘ ํ–‰๋ ฌ์€ 2์ฐจ์› ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ์ด๋ฅผ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค๋‹ค. N์ด ๋งŒ์•ฝ 10000 ์ด๋Ÿฌ๋ฉด 10000 * 10000 ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ ์‹œ๊ฐ„์ด N์ด ํด์ˆ˜๋ก ์ ์  ๋Š˜์–ด๋‚œ๋‹ค. 

 

๋”ฐ๋ผ์„œ ์ธ์ ‘ ํ–‰๋ ฌ ๋ณด๋‹ค๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค. 

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•  ๋•Œ๋Š” ArrayList ๋กœ subGraph ๋ฆฌ์ŠคํŠธ๋ฅผ  ๋งŒ๋“ค์–ด์„œ subGraph.get(1) ์—๋Š” ๋…ธ๋“œ 1์ด ๊ฐˆ ์ˆ˜์žˆ๋Š” ๋…ธ๋“œ 2, 3, 4 ๋ฅผ ์ €์žฅํ•˜๊ณ , subGraph.get(2)์—๋Š” ๋…ธ๋“œ 2๊ฐ€ ํ–ฅํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ ... ํ•ด์„œ 

subGraph.get(1), subGraph.get(2),  subGraph.get(3),  subGraph.get(4),  subGraph.get(5) ๋ฅผ ์ €์žฅํ•˜๋Š” Arraylist๋ฅผ ๋งŒ๋“ ๋‹ค. 

-> ArrayList<Arraylist<Integer>> graph๋ฅผ ๋งŒ๋“ค๋ผ๋Š” ๋œป ! ( ArrayList<subGraph> graph)

 

for (int i = 0; i <= n; i++) { // get(5) ๊นŒ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ n๊นŒ์ง€ ๋ฐ˜๋ณต
   graph.add(new ArrayList<>()); // ์ •์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ Arraylist ๊ฐ์ฒด ์ €์žฅ
}
ch = new int[n+1];

for (int i = 0; i < m; i++) {
   int a = scanner.nextInt();
   int b = scanner.nextInt();
   graph.get(a).add(b);
}

ch[1] = 1;
int result = routeNavigationList.DFS(1);
System.out.println(result);

-> ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์—์„œ graph ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ๋…ธ๋“œ 1 ~ ๋…ธ๋“œ 5๊นŒ์ง€์˜ arraylist๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ for๋ฌธ์„ ํ†ตํ•ด 0๋ถ€ํ„ฐ n๊นŒ์ง€ ๊ตฌํ•ด์ค€๋‹ค. (๊ทธ๋ž˜์•ผ 0์€ ์ œ์™ธํ•˜๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ) 

๊ทธ๋ฆฌ๊ณ  for๋ฌธ์„ ํ†ตํ•ด์„œ graph.get(a) ๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ a๊ฐ€ ํ–ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ b๋ฅผ add ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋จผ์ € 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ch[1]์€ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ๋œป์œผ๋กœ 1๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ  DFS ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

 

public int DFS(int v) {

   if (v == n) {
      answer++;
   }else {
      for (int nv : graph.get(v)) {
         if (ch[nv] == 0) {
            ch[nv] = 1;
            DFS(nv);
            ch[nv] = 0;
         }
      }
   }

   return answer;
}

๊ทธ๋ฆฌ๊ณ  DFS๋Š” ์ธ์ ‘ ํ–‰๋ ฌ์— ๋น„ํ•ด ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ๊ฐ„๊ฒฐํ•ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

DFS๋Š” ๊ธฐ๋ณธ ํ‹€๋กœ if-else๋กœ ๊ฐ€๋ฉด ๋˜๋Š”๋ฐ if์—๋Š” ๋จผ์ € v๊ฐ€ n๊นŒ์ง€ ๊ฐ”๋‹ค๋Š” ๊ฒƒ์€ ๋ง๋‹จ ๋…ธ๋“œ๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— DFS ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  answer +1 ํ•ด์ค€๋‹ค. 

 

๋งŒ์•ฝ n ์ด v๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด graph.get(v)๋ฅผ ํ†ตํ•ด v ๋…ธ๋“œ๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ nv ๊บผ๋‚ด๊ณ , ์ด ๋…ธ๋“œ nv๊ฐ€ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธํ•ด๋ณด๊ณ (ch[nv] ==1) , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด (ch[nv] == 0) ch[nv] ์„ 1๋กœ ๋ฐ”๊พธ๊ณ , DFS(nv)๋ฅผ ํ˜ธ์ถœํ•ด์„œ nv ๊ธฐ์ค€์œผ๋กœ ๋˜ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

 

 

728x90

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

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch08. DFS, BFS ํ™œ์šฉ : ํ•ฉ์ด ๊ฐ™์€ ๋ถ€๋ถ„ ์ง‘ํ•ฉ (DFS, ์•„๋งˆ์กด ์ธํ„ฐ๋ทฐ)  (1) 2023.12.01
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ (BFS)  (0) 2023.11.30
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘ํ–‰๋ ฌ) DFS  (0) 2023.11.28
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ (BFS)  (0) 2023.11.27
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ (DFS)  (2) 2023.11.27