Algorithm/Inflearn

[알고리즘/인프런] 경로 탐색(인접행렬)

개발자 김비숑 2023. 5. 21. 13:59
반응형

문제 

방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지 수를 출력하는 프로그램을 작성하세요. 아래 그래프에서 1번 정점에서 5번 정점으로 가는 가지 수는 총 6 가지입니다.

 

풀이

function solution(n, arr) {
  let graph = Array.from({ length: n + 1 }, () => Array(n + 1).fill(0));
  let ch = Array.from({ length: n + 1 }, () => 0);
  let answer = 0;

  // 인접행렬
  for (let [a, b] of arr) {
    graph[a][b] = 1;
  }

  function DFS(v) {
    if (v === n) answer += 1;
    else {
      for (let i = 1; i <= n; i++) {
        if (graph[v][i] === 1 && ch[i] === 0) {
          ch[i] = 1;
          DFS(i);
          ch[i] = 0;
        }
      }
    }
  }

  // 시작점 방문 표시
  ch[1] = 1;
  DFS(1);
  return answer;
}

그래프 탐색 시 다음 재귀 함수를 호출할 때 DFS(i) 로 호출한다. 각 for문을 돌면서 가능한 다음 정점이 i 가 되고, 이것을 다음 시작점으로 넘겨주기 위해서이다.

또 DFS(1)로 시작점을 넘겨주면서 ch[1]=1로 체크 표시를 하지 않아 다시 시작점으로 되돌아가는 문제가 있었는데 이 부분에 유의해야겠다.

반응형