백준 2644 - 촌수계산
Updated:
Java
2644 번 - 촌수계산
문제
접근 방법
2차원 배열을 통해 부모 - 자식간의 관계를 나타내었다.
이후 DFS의 그래프 탐색을 통해 주어진 사람을 찾아, 그 사람을 찾기까지 DFS를 호출한 개수를 결과로 반환한다.
중복되어 DFS를 탐색하는 것을 방지하기 위해, 각 사람의 DFS 방문 여부를 나타내는 1차원 배열을 사용하였다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, result = -1, start, end;
static boolean[] vis;
static boolean[][] conn;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = stoi(br.readLine());
StringTokenizer stk = new StringTokenizer(br.readLine());
start = stoi(stk.nextToken());
end = stoi(stk.nextToken());
vis = new boolean[n + 1];
conn = new boolean[n + 1][n + 1];
// 부모, 자식 관계 나타내기
int m = stoi(br.readLine()), a, b;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
conn[a][b] = true;
conn[b][a] = true;
}
DFS(start, 0);
System.out.println(result);
br.close();
}
private static boolean DFS(int curN, int cnt) {
// 한번 방문한 사람이면
if(vis[curN])
return false;
// 찾는 사람이면
if(curN == end) {
result = cnt;
return true;
}
vis[curN] = true;
for(int i = 1; i <= n; i++) {
if(conn[curN][i]) {
if(DFS(i, cnt + 1)) // 찾으면 true를 반환하여 DFS를 조기 종료한다.
return true;
}
}
return false;
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}