SSONG Cloud
[백준] 17129 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유 본문
반응형
문제 출처: www.acmicpc.net/problem/17129
17129번: 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유
첫째 줄에 정보섬 2층의 크기 n과 m이 주어진다. (1 ≤ n,m ≤ 3000, 4 ≤ n×m ≤ 9×106) 이후 n행 m열에 걸쳐 0, 1, 2, 3, 4, 5로만 구성된 Ai,j가 주어진다. Ai,j와 Ai,j+1사이에 공백은 주어지지 않는다. 2,
www.acmicpc.net
: 우선 딱따구리 이름이 굉장히 길어서 조금 보기 힘들지만 사실 별 특이한건 없다.
: 딱따구리 가족이 가장 빠르게 음식에 도달하는 거리를 찾는 것이다.
: 어떤 음식이든 상관없이 하나에라도 도달하면 되기 때문에 음식을 구별해줄 필요는 없다.
: BFS 방식으로 접근할 수 있는데, 벽일 때 즉 값이 1일 때와 범위를 벗어날 때 그리고 이미 갔던 곳만 제외하고 탐색할 수 있도록 한다.
: 만약 새롭게 탐색한 곳에 음식이 있다면 그 즉시 탐색을 멈추고 그 때까지 걸렸던 거리를 반환해 준다.
: 만약 while문 중간에 멈추지 않고 끝까지 모두 탐색한 경우는 음식에 도달할 수 없는 경우이기 때문에 구별해주기 위해 -1을 반환하도록 한다.
: 그 후 main 메소드로 돌아와서 return 값이 -1일 때 즉, 음식에 도달할 수 없을 때와
: return이 -1이 아닐 때 즉, 음식에 도달할 경우를 나눠 출력형식에 맞춰 출력해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static int[][] map;
static boolean[][] v;
public static void main(String[] args) throws IOException {
// 행렬의 크기 N과 M을 입력받고
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
// 행렬을 만든 후
map = new int[N][M];
v = new boolean[N][M];
int r = -1, c = -1;
// 행렬의 값을 입력받으면서
for(int i = 0; i < N; i++) {
String[] tmp = br.readLine().split("");
for(int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(tmp[j]);
// 식구 즉, 2인 곳의 행과 열을 따로 저장해놓고
if(map[i][j] == 2) {
r = i;
c = j;
}
}
}
// bfs 방식으로 접근
int ans = bfs(r, c);
if(ans == -1) {
System.out.println("NIE");
}else {
System.out.println("TAK\n"+ans);
}
}
static int[] dr = {-1, 1, 0, 0};
static int[] dc = {0, 0, -1, 1};
private static int bfs(int r, int c) {
Queue<int[]> q = new LinkedList<>();
q.offer(new int[] {r, c, 0});
while(!q.isEmpty()) {
int[] loc = q.poll();
for(int d = 0; d < 4; d++) {
int nr = loc[0] + dr[d];
int nc = loc[1] + dc[d];
if(nr < 0 || nr >= N || nc < 0 || nc >= M || v[nr][nc] || map[nr][nc] == 1) continue;
if(map[nr][nc] == 3 || map[nr][nc] == 4 || map[nr][nc] == 5) return loc[2]+1;
v[nr][nc] = true;
q.offer(new int[] {nr, nc, loc[2]+1});
}
}
return -1;
}
}
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1916 최소비용 구하기 (0) | 2021.03.22 |
---|---|
[백준] 16562 친구비 (0) | 2021.03.19 |
[백준] 10026 적록색약 (0) | 2021.03.15 |
[백준] 1927 최소 힙 (0) | 2021.03.10 |
[백준] 1744 수 묶기 (0) | 2021.03.10 |
Comments