hye-log

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

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
Comments