본문 바로가기
코딩테스트 및 알고리즘

경로 탐색 ( 인접 리스트 )

by 영카이브 2024. 3. 4.

문제. 방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지 수를 출력한다.

해당 그래프에서 1번에서 5번 정점으로 가는 가지수를 구하시오.

 

첫째 줄에는 정점의 수 N(1<=N<=20)와 간선의 수 M개가 주어진다. 그 다음부터 M줄에 걸쳐 연결정보가 주어진다. 

 

입력 예시

5 9
1 2
1 3
1 4
2 1
2 3
2 5
3 4
4 2
4 5

 

답 : 6

 

 

나의 답변

public class Main {
    static int n, m, answer = 0;
    static int[] ck; // 각 노드의 방문 여부를 나타내는 배열
    static ArrayList<ArrayList<Integer>> graph; // 그래프를 표현하기 위한 인접리스트

    // 깊이 우선 탐색(DFS)을 수행하는 메서드
    public void DFS(int v) {
        if (v == n) // 현재 노드가 목표 도착지인 경우
            answer++; // 경로 카운트를 증가시킴
        else {
            for (int nv : graph.get(v)) { // 현재 노드에 연결된 모든 인접 노드에 대해 반복
                if (ck[nv] == 0) { // 인접 노드가 아직 방문되지 않은 경우
                    ck[nv] = 1; // 방문 표시
                    DFS(nv); // 해당 인접 노드를 방문하기 위해 재귀 호출
                    ck[nv] = 0; // 인접 노드 방문 완료 후 방문 표시 해제
                }
            }
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt(); // 노드의 개수 입력
        m = sc.nextInt(); // 간선의 개수 입력
        ck = new int[n + 1]; // 방문 여부를 저장하는 배열 초기화
        graph = new ArrayList<ArrayList<Integer>>(); // 그래프 초기화

        // 각 노드별로 인접 리스트 초기화
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // 간선 정보 입력
        for (int i = 0; i < m; i++) {
            int a = sc.nextInt(); // 연결된 노드 입력
            int b = sc.nextInt(); // 연결된 노드 입력
            graph.get(a).add(b); // 그래프에 연결 정보 추가
        }

        ck[1] = 1; // 출발 노드를 방문 표시
        T.DFS(1); // DFS 호출하여 탐색 시작
        System.out.println(answer); // 모든 경로 탐색이 끝난 후 도착지에 도달한 횟수 출력
    }
}

 

for 루프의 조건을 i <= n으로 설정하는 이유 : 인덱스 i가 노드를 나타내고 실제 노드 번호는 1부터 n까지이다.

따라서 graph 리스트의 크기를 n+1로 만들어야한다. 이렇게 하면 인덱스 0은 사용하지 않고, 노드 번호와 인덱스가 일치하게 된다. 

'코딩테스트 및 알고리즘' 카테고리의 다른 글

그래프 최단 거리(BFS)  (0) 2024.03.06
경로 탐색(인접행렬)  (0) 2024.03.01
경로 탐색(인접 행렬)  (0) 2024.02.28
BFS 응용  (0) 2024.02.24
BFS(큐 사용)  (0) 2024.02.23