BOJ_2644_촌수계산
2021. 9. 15. 07:31ㆍ백준 알고리즘(BOJ)
1.
구분: 그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색
언어: Java
전략
- 각 촌수의 연결 관계를 그래프로 보고, 이를 배열에 저장 - 연결되어있으면 true, 아니면 false(default)
- BFS로 그래프를 탐색
- 촌수가 1씩 증가하는 것은, 나에게서 인접한 것들이다.
- 따라서 나와 인접한 것을 큐에 삽입할 때, 내 번호와 촌수를 함께 넣는다.
2. 코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static class Node{
//q에 넣을 사람번호와 start기준 촌수
int item;
int level;
Node(int item, int level){
this.item = item;
this.level = level;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); //전체 사람의 수
int start = scanner.nextInt(); //찾으려는 사람1
int target = scanner.nextInt(); //찾으려는 사람2
int m = scanner.nextInt(); //관계의 수
boolean[][] matrix = new boolean[n+1][n+1];
int clevel=0; //처음 시작 촌수
//친척 관계를 배열에 등록한다.
for(int i = 0; i<m; i++) {
int p = scanner.nextInt();
int c = scanner.nextInt();
matrix[p][c] = true;
matrix[c][p] = true;
}
//친척인지 아닌지를 파악하는 boolean
boolean okay = false;
Queue<Node> q = new LinkedList<>();
boolean[] check = new boolean[n+1]; //방문여부 확인 배열
//시작점과 촌수를 넣고 방문처리
q.offer(new Node(start, clevel));
check[start] = true;
while(!q.isEmpty()) {
Node node = q.poll();
int current = node.item;
clevel = node.level;
//찾는 것과 같다면 그만
if(current == target)
{
//친척이라 확인
okay = true;
break;
}
for(int i = 0; i<n+1; i++) {
//방문 안하고, 둘이 인접해 있으면
if(!check[i] && matrix[current][i])
{
//나의 아이템과, 촌수(나를 부른 것보다 1크게)를 q에 넣는다.
q.offer(new Node(i,clevel+1));
check[i] = true;
}
}
}
//친척이라면
if(okay)
System.out.println(clevel);
else //친척이 아니라면
System.out.println(-1);
//bfs(start, target);
}
}
3
BFS를 이용하면 풀 수 있다.
백준의 토마토(7576)과 유사하다
'백준 알고리즘(BOJ)' 카테고리의 다른 글
BOJ_2178_미로 탐색 (0) | 2021.09.17 |
---|---|
BOJ_17086_아기 상어2 (0) | 2021.09.15 |
BOJ_2529_부등호 (0) | 2021.09.08 |
BOJ_16968_차량 번호판1 (0) | 2021.09.07 |
BOJ_7568_덩치 (0) | 2021.09.01 |