CodingTest/Baekjoon

[백준]14940번 쉬운 최단거리(JAVA)

iihye_ 2023. 8. 18. 18:57

0. 문제 링크

https://www.acmicpc.net/problem/14940

 

14940번: 쉬운 최단거리

지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이

www.acmicpc.net

 

1. 문제 설명

1) 모든 지점에 대해서 목표지점까지의 거리 구하기

2) 0 : 갈 수 없는 땅, 1 : 갈 수 있는 땅, 2 : 목표 지점

3) 원래 갈 수 있는 땅 중 도달할 수 없으면 -1 출력

 

2. 입출력

// input
15 15
2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1

// output
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
11 12 13 14 15 16 17 18 19 20 0 0 0 0 25
12 13 14 15 16 17 18 19 20 21 0 29 28 27 26
13 14 15 16 17 18 19 20 21 22 0 30 0 0 0
14 15 16 17 18 19 20 21 22 23 0 31 32 33 34

 

3. 코드

import java.awt.Point;
import java.io.*;
import java.util.*;

class Pos{
	int r, c, cnt;
	
	public Pos(int r, int c, int cnt) {
		this.r = r;
		this.c = c;
		this.cnt = cnt;
	}
}

public class b14940 {
	
	static int[] dr = {-1, 1, 0, 0};
	static int[] dc = {0, 0, -1, 1};

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int[][] map = new int[N][M];
		int[][] v = new int[N][M];
		
		Pos start = new Pos(0, 0, 0);
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				
				if(map[i][j] == 2) { // 목표 지점 설정
					start.r = i;
					start.c = j;
					start.cnt = 0;
				} 
				else if(map[i][j] == 1) { // 갈 수 있는 땅
					v[i][j] = -1; // 도달할 수 없으면 -1
				}
			}
		}
		
		Queue<Pos> q = new LinkedList<Pos>();
		q.offer(start); // 시작 지점 추가
		
		while(!q.isEmpty()) { // 큐가 빌 때까지
			Pos p = q.poll(); // 큐에서 하나 꺼내기
			for (int i = 0; i < 4; i++) { // 사방탐색
				int nr = p.r + dr[i];
				int nc = p.c + dc[i];
				// 범위 내에 있고, 갈 수 있는 땅이며, 아직 안 갔으면
				if(nr >= 0 && nr < N && nc >= 0 && nc < M && map[nr][nc] == 1 && v[nr][nc] == -1) {
					v[nr][nc] = p.cnt + 1;
					q.offer(new Pos(nr, nc, p.cnt + 1));
				}
			}
		}
		
		// 출력
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				sb.append(v[i][j]).append(" "); 
			}
			sb.append("\n");
		}		
		System.out.println(sb);
	}

}

 

실행 결과

 

4. 회고

1) 모든 지점에서 목표 지점까지의 거리를 구하는 문제이지만, 반대로 생각해서 목표 지점에서 모든 지점까지의 거리를 구하는 방법으로 생각

2) 모든 경우를 가지치기 하듯 퍼져 나가는 방식이므로 bfs 구조로 구현

 

5. Github

 

 

728x90