6118번: 숨바꼭질
재서기는 수혀니와 교외 농장에서 숨바꼭질을 하고 있다. 농장에는 헛간이 많이 널려있고 재서기는 그 중에 하나에 숨어야 한다. 헛간의 개수는 N(2 <= N <= 20,000)개이며, 1 부터 샌다고 하자. 재
www.acmicpc.net
문제
재서기는 수혀니와 교외 농장에서 숨바꼭질을 하고 있다. 농장에는 헛간이 많이 널려있고 재서기는 그 중에 하나에 숨어야 한다. 헛간의 개수는 N(2 <= N <= 20,000)개이며, 1 부터 샌다고 하자.
재서기는 수혀니가 1번 헛간부터 찾을 것을 알고 있다. 모든 헛간은 M(1<= M <= 50,000)개의 양방향 길로 이어져 있고, 그 양 끝을 A_i 와 B_i(1<= A_i <= N; 1 <= B_i <= N; A_i != B_i)로 나타낸다. 또한 어떤 헛간에서 다른 헛간으로는 언제나 도달 가능하다고 생각해도 좋다.
재서기는 발냄새가 지독하기 때문에 최대한 냄새가 안나게 숨을 장소를 찾고자 한다. 냄새는 1번 헛간에서의 거리(여기서 거리라 함은 지나야 하는 길의 최소 개수이다)가 멀어질수록 감소한다고 한다. 재서기의 발냄새를 최대한 숨길 수 있는 헛간을 찾을 수 있게 도와주자!
입력
첫 번째 줄에는 N과 M이 공백을 사이에 두고 주어진다.
이후 M줄에 걸쳐서 A_i와 B_i가 공백을 사이에 두고 주어진다.
출력
출력은 한줄로 이루어지며, 세 개의 값을 공백으로 구분지어 출력해야한다.
첫 번째는 숨어야 하는 헛간 번호를(만약 거리가 같은 헛간이 여러개면 가장 작은 헛간 번호를 출력한다), 두 번째는 그 헛간까지의 거리를, 세 번째는 그 헛간과 같은 거리를 갖는 헛간의 개수를 출력해야한다.
풀이
가장 가까운 곳을 찾아야 하는 문제이기 때문에 dfs보다는 bfs로 풀이를 했다 자세한 설명은 주석으로 달아 뒀다
코드
import java.io.*;
import java.util.*;
public class S1_6118_숨바꼭질 {
static int num, min, cnt;
static ArrayList[] map;
static boolean[] visited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
map = new ArrayList[N+1];
visited = new boolean[N+1];
for (int i = 1; i <= N; i++) {
map[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
map[a].add(b);
map[b].add(a);
}
bfs(1);
sb.append(num).append(" ").append(min).append(" ").append(cnt);
System.out.println(sb);
}
private static void bfs(int start) {
Queue<int[]> queue = new LinkedList<>();
// 시작 위치, 길이 저장
queue.add(new int[] {start, 0});
// 방문한 위치 저장
visited[start] = true;
// bfs
while(!queue.isEmpty()) {
int[] a = queue.poll();
int now = a[0]; // 현재 위치
int len = a[1]; // 다음 위치까지 갈 때 걸리는 총 거리
if(len > min) { // 거리가 최소 거리보다 클 때
min = len; // 최소 거리 갱신
num = now; // 현재 위치 갱신
cnt = 1; // 같은 거리를 갖는 헛간의 개수 초기화
} else if (len == min) { // 거리가 최소 거리와 같을 때
num = Math.min(num, now); // 둘 중 숫자가 작은 헛간 저장
cnt++; // 같은 거리를 갖는 헛간의 개수 초기화
}
for (int i = 0; i < map[now].size(); i++) {
int next = (int) map[now].get(i);
if(visited[next]) continue;
visited[next] = true;
queue.add(new int[] {next, len+1});
}
}
}
}
결과
#자바 #java #boj #백준 #알고리즘
'알고리즘 > BOJ' 카테고리의 다른 글
[JAVA][BOJ][S3] 11659. 구간 합 구하기 4 (0) | 2022.11.30 |
---|---|
[JAVA][BOJ][S4] 26069. 붙임성 좋은 총총이 (0) | 2022.11.30 |
[JAVA][BOJ][B2] 2908. 상수 (0) | 2022.07.29 |
[JAVA][BOJ][S1] 1080. 행렬 (0) | 2022.07.28 |
[JAVA][BOJ][S1] 11057. 오르막 수 (0) | 2022.07.27 |