코딩테스트/자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

섹션 7 Recursive, Tree, Graph - 11. 경로탐색 (인접행렬)

DevDigger 2025. 4. 30. 16:28

📌 문제 설명

방향 그래프가 주어졌을 때,
1번 정점에서 N번 정점으로 가는 모든 경로의 개수를 구하는 프로그램을 작성한다.

예를 들어 아래 그래프에서 1 → 5로 가는 경로는 총 6가지다.

1 → 2 → 5  
1 → 3 → 4 → 2 → 5  
1 → 3 → 4 → 5  
1 → 4 → 2 → 5  
1 → 4 → 5  
1 → 2 → 3 → 4 → 5

📝 입력 & 출력

입력

  • 첫 줄에 정점의 수 N(1 ≤ N ≤ 20), 간선의 수 M이 주어진다.
  • 다음 M줄에 걸쳐 방향 간선 정보 A B가 주어진다. (A → B)

출력

  • 1번 정점에서 N번 정점으로 갈 수 있는 모든 경로의 가지 수를 출력한다.

🔹 예제 입력 & 출력

예제 입력

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

 

예제 출력

6

💡 해결 방법

  • 정점 간 연결 정보를 인접행렬로 저장
  • DFS를 사용해 1번 정점에서 시작해서 N번 정점에 도달할 때마다 경로 수 증가
  • 방문 배열을 사용해 이미 방문한 노드는 다시 방문하지 않도록 한다
  • DFS가 종료되면 해당 노드는 방문 해제 (백트래킹)

💻 코드 구현 (Java)

전체 코드

package partRecursiveTreeGraph;

import java.util.*;

public class Problem11 {
	static int n, m, answer = 0;
	static int[][] graph;
	static int[] ch;

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

	public static void main(String[] args) {
		Problem11 T = new Problem11();
		Scanner kb = new Scanner(System.in);
		n = kb.nextInt();
		m = kb.nextInt();
		graph = new int[n+1][n+1];
		ch = new int[n+1];
		for (int i = 0; i < m; i++) {
			int a = kb.nextInt();
			int b = kb.nextInt();
			graph[a][b] = 1;
		}
		ch[1] = 1;
		T.DFS(1);
		System.out.print(answer);
	}
}

📖 코드 설명

1️⃣ 인접행렬 초기화

graph = new int[n+1][n+1];
  • 방향 그래프는 2차원 배열을 사용한 인접행렬로 표현
  • graph[a][b] = 1이면 정점 a에서 b로 이동 가능

2️⃣ 방문 체크 배열

ch = new int[n+1];
  • DFS에서 사이클 방지 및 중복 경로 방지를 위해 방문 여부 체크

3️⃣ DFS 함수

 
public void DFS(int v) {
	if (v == n) answer++;
	else {
		for (int i = 1; i <= n; i++) {
			if (graph[v][i] == 1 && ch[i] == 0) {
				ch[i] = 1;
				DFS(i);
				ch[i] = 0;
			}
		}
	}
}
  • v == n: 목적지 N번 정점 도달 → answer++
  • graph[v][i] == 1 && ch[i] == 0: 다음 이동 가능한 정점이면서 아직 방문하지 않았을 때만 이동
  • DFS(i) 호출 후 → 다시 돌아와 방문 해제 (백트래킹)

4️⃣ DFS 시작

ch[1] = 1;
T.DFS(1);
  • 시작 정점은 1번
  • 방문 체크한 뒤 DFS 탐색 시작

⏳ 시간 복잡도 분석

  • 그래프의 구조에 따라 탐색 경로 수는 지수적으로 증가할 수 있다.
  • DFS는 모든 경로를 완전탐색하기 때문에
  • 시간 복잡도는 O(총 경로 수 × 평균 경로 길이) 수준이다.
  • 하지만 N ≤ 20이므로 모든 경로를 탐색해도 실행 시간상 문제 없다.

🧠 핵심 정리

  • 방향 그래프는 인접행렬로 표현
  • DFS를 통해 1번에서 N번까지 도달하는 모든 경로를 탐색
  • 중복 경로 방지 위해 방문 배열 사용 + 백트래킹 필수
  • 시간 복잡도는 N이 작을 때만 완전탐색 가능

출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard

 

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런

김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급

www.inflearn.com