[백준] 문제 2644 번 : 촌수 계산 - JAVA
2024. 12. 7. 21:48 - DoosanBaek
[링크] : https://www.acmicpc.net/problem/2644
💎 문제 분석 & 제약 조건
문제 분석 :
주어진 입력에서 촌수를 계산해야 하는 두 사람의 번호가 주어지고,
부모 자식 관계가 주어집니다. 관계를 바탕으로 두 사람 사이의 촌수를 계산한다.
관계가 없으면 -1을 출력한다.
제약 조건 :
사람들은 1부터 n까지의 연속된 번호로 표시 된다.
전체 사람의 수 n은 1 ≤ n ≤ 100 이다.
입력의 첫 번째 줄에는 전체 사람의 수 n이 주어진다.
두 번째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다.
세 번째 줄에는 부모 자식 간의 관계의 개수 m이 주어진다.
이후 m개의 줄에는 두 번호 x, y가 주어지며, x는 y의 부모 번호를 나타낸다.
각 사람의 부모는 최대 한 명만 주어진다.
🚀 의사 결정
1.ArrayList를 사용한 인접 리스트 형태로 그래프를 표현하고, 노드 번호를 1부터 N까지 설정한다.
2. BFS를 사용하여 최단 경로를 탐색한다.
3. 방문 여부를 체크하기 위해 boolean[] visited를 사용한다.
4. 촌수를 계산하여 출력하며, 도달하지 못하면 -1을 반환한다.
📜 소스코드(Java)
import java.io.*;
import java.util.*;
public class Main {
static int N, M; // 총 사람의 수
static boolean[] visited;
static List<Integer>[] relation;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
// 입력
N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken()); // 촌수 계산 시작
int target = Integer.parseInt(st.nextToken()); // 촌수 에임
M = Integer.parseInt(br.readLine()); // 부모-자식 관계 수
// 촌수 초기화
relation = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
relation[i] = new ArrayList<>();
}
// 촌수 입력
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int parent = Integer.parseInt(st.nextToken());
int child = Integer.parseInt(st.nextToken());
relation[parent].add(child); // 양방향이여서 관계
relation[child].add(parent);
}
// 탐색한곳 visited
visited = new boolean[N + 1];
// bfs 탐색
int result = bfs(start, target);
// 출력
bw.write(result + "\n");
bw.flush();
bw.close();
br.close();
}
// bfs 탐색 시작
private static int bfs(int start, int target) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{start, 0}); // 시작 지점
visited[start] = true; // 방문처리 ( 처음시작이니깐 )
while (!queue.isEmpty()) {
int[] current = queue.poll(); // 현재 위치 ( 촌수 )
int node = current[0];
int depth = current[1];
if ( node == target) {
return depth; // 시작점으로 부터 거리
}
// 탐색
for(int i = 0; i < relation[node].size(); i++) {
if (!visited[relation[node].get(i)]) {
queue.add(new int[]{relation[node].get(i), depth + 1});
visited[relation[node].get(i)] = true;
}
}
}
return -1; // 촌수 계산이 안되는 경우
}
}
'알고리즘' 카테고리의 다른 글
[백준] 문제 2606번 : 바이러스 (1) | 2024.12.09 |
---|---|
[백준] 문제 7562번 : 나이트의 이동 (0) | 2024.12.09 |
[백준] 문제 2805번 : 나무 자르기 - JAVA (0) | 2024.12.07 |
[백준] 문제 24444번 : 알고리즘 수업 - 너비 우선 탐색 1 - JAVA (0) | 2024.12.07 |
[백준] 문제 24479번 : 깊이 우선 탐색 1 - JAVA (0) | 2024.12.07 |
[백준] 문제 3187번 : 양치기 꿍 - JAVA (0) | 2024.12.06 |
[백준] 문제 2210번 : 숫자판 점프 - JAVA (0) | 2024.12.06 |
[백준] 문제 13116 : 30번 - JAVA (0) | 2024.12.06 |