문제 내용은 입력으로 들어온 값을 통해 촌수를 찾아줘야 하는데 촌수 개념은 1에 2,3 이 연결되어 있으면
2,3은 1이고 2에 4가 연결되어 있으면서 1과 4를 받으면 2인 셈인데
그래프에서 연결된 노드로 depth가 내려갈 수록 1촌씩 증가한다고 보면 되겠다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
public class Main {
static Map<Integer, ArrayList<Integer>> graph = new HashMap<>();
static HashSet<Integer> visited = new HashSet<>();
static int[] location;
public static int bfs(int start, int target) {
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
visited.add(start);
while (!queue.isEmpty()) {
Integer poll = queue.poll();
for (int neighbor : graph.get(poll)) {
if (!visited.contains(neighbor)) {
queue.add(neighbor);
visited.add(neighbor);
location[neighbor] = location[poll] + 1;
if (neighbor == target) {
return location[neighbor];
}
}
}
}
return -1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int vertex = Integer.parseInt(br.readLine());
int[] compare = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int count = Integer.parseInt(br.readLine());
for (int i = 0; i < count; i++) {
int[] edges = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
graph.putIfAbsent(edges[0], new ArrayList<>());
graph.putIfAbsent(edges[1], new ArrayList<>());
graph.get(edges[0]).add(edges[1]);
graph.get(edges[1]).add(edges[0]);
}
location = new int[vertex + 1];
System.out.println(bfs(compare[0], compare[1]));
}
문제를 풀어보자면 graph 안에 받은 간선들을 모두 연결해주고 BFS를 돌려줘야 하는데 현 위치 기준으로 Depth가 증가할 때마다 해당 location 기준으로 +1씩 해주는 식으로 아래로 내려가면서 촌수를 증가시켜 줄 수 있고
Queue를 계속 돌려주다가, 목표에 해당하는 값을 만나면, 촌수를 출력해주면 끝이고 Queue를 모두 돌려도 촌수를 구하지 못했다면 -1을 출력해주자
Leave a Reply