문제
- 2차원의 형태로 1은 지나갈 수 있는 길, 0은 벽, 2가 출발지로 주어질 때, 출발지에서 모든 다른 지점까지의 최단 거리를 2차원 형태로 출력하는 문제.
아이디어
- 최단거리를 구하는 문제로, BFS를 사용해 풀이한다.
- 입력을 받으며 2의 위치를 먼저 큐에 넣어놓고 해당 경로를 0으로 초기화 한 후, BFS를 돌린다.
- BFS를 돌리며 최단거리를 갱신하고 과정이 모두 끝난 후, 각 요소를 탐색해 길인데 도달하지 못한 요소를 -1로 변경한 후 출력해준다.
풀이
import java.io.*;
import java.util.*;
public class Main {
static int n, m;
static int[][] graph;
static boolean[][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static Deque<int[]> queue = new ArrayDeque<>();
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());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
graph = new int[n][m];
visited = new boolean[n][m];
// 그래프 입력
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++) {
graph[i][j] = Integer.parseInt(st.nextToken());
// 출발 좌표 큐에 저장
if(graph[i][j] == 2) {
queue.addLast(new int[]{i, j});
// BFS 도중 경로 갱신에 사용하기 위해 출발지를 0으로 초기화
graph[i][j] = 0;
visited[i][j] = true;
}
}
}
bfs();
// 모든 요소 탐색 중, 길인데 도달할 수 없으면 -1로 변경
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(graph[i][j] == 1 && !visited[i][j]) {
graph[i][j] = -1;
}
sb.append(graph[i][j]).append(' ');
}
sb.append('\n');
}
System.out.println(sb);
}
static void bfs() {
while(!queue.isEmpty()) {
int[] tmp = queue.removeFirst();
int x = tmp[0];
int y = tmp[1];
for(int i=0; i<4; i++) {
int nx = x+dx[i];
int ny = y+dy[i];
if(nx<0 || ny<0 || nx>=n || ny>=m) {
continue;
}
// 방문하지 않았고, 길이면 최단경로 갱신
if(!visited[nx][ny] && graph[nx][ny] == 1) {
visited[nx][ny] = true;
graph[nx][ny] = graph[x][y]+1;
queue.addLast(new int[]{nx, ny});
}
}
}
}
}
채점 결과
문제 링크
'백준' 카테고리의 다른 글
[JAVA] 백준 7569번: 토마토 (1) | 2024.09.01 |
---|---|
[JAVA] 백준 5430번: AC (0) | 2024.09.01 |
[JAVA] 백준 11403번: 경로 찾기 (0) | 2024.08.27 |
[JAVA] 백준 11286번: 절댓값 힙 (0) | 2024.08.26 |
[JAVA] 백준 6064번: 카잉 달력 (0) | 2024.08.25 |