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

2024. 12. 1. 01:52·Algorithm
반응형

2024.08.13

[14940번 : 쉬운 최단거리] - Silver1


[ 문제 ]

지도가 주어지면 모든 지점에 대해서 목표지점까지의 거리를 구하여라.

문제를 쉽게 만들기 위해 오직 가로와 세로로만 움직일 수 있다고 하자.


[ 입력 ]

지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)

다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이다. 입력에서 2는 단 한개이다.


[ 출력 ]

# 예제 입력 1
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

# 예제 출력 1
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

[ Code ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int[][] map;
    static int[][] dis;
    static boolean[][] visited;
    static int[] dy = {-1, 1, 0, 0}, dx = {0, 0, -1, 1};
    static int n, m;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[n][m];
        dis = new int[n][m];
        visited = new boolean[n][m];

        int startY = 0, startX = 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) {
                    startY = i;
                    startX = j;
                }
            }
        }

        dis[startY][startX] = 0;
        bfs(startY, startX);

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!visited[i][j] && map[i][j] == 1) {
                    dis[i][j] = -1;
                }
                System.out.print(dis[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static void bfs(int y, int x) {
        visited[y][x] = true;
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{y, x});

        while (!q.isEmpty()) {
            int[] now = q.poll();

            for (int i = 0; i < 4; i++) {
                int curY = now[0] + dy[i];
                int curX = now[1] + dx[i];

                if (isVaild(curY, curX) && !visited[curY][curX] && map[curY][curX] == 1) {
                    q.offer(new int[]{curY, curX});
                    visited[curY][curX] = true;
                    dis[curY][curX] = dis[now[0]][now[1]] + 1;
                }
            }
        }
    }

    public static boolean isVaild(int y, int x) {
        return 0 <= y && y < n && 0 <= x && x < m;
    }
}
반응형

'Algorithm' 카테고리의 다른 글

[JAVA] Programmers : 햄버거 만들기  (0) 2024.12.01
[JAVA] Programmers : 신규 아이디 추천  (0) 2024.12.01
[JAVA] 백준 2075번 : N번째 큰 수  (0) 2024.12.01
[JAVA] Programmers : 둘만의 암호  (0) 2024.12.01
[JAVA] 백준 9251번 : LCS  (1) 2024.12.01
'Algorithm' 카테고리의 다른 글
  • [JAVA] Programmers : 햄버거 만들기
  • [JAVA] Programmers : 신규 아이디 추천
  • [JAVA] 백준 2075번 : N번째 큰 수
  • [JAVA] Programmers : 둘만의 암호
ssu_dev
ssu_dev
  • ssu_dev
    ssu
    ssu_dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (71)
      • Cloud (13)
      • Algorithm (42)
      • Computer Science (5)
      • System (6)
      • Trouble Shooting (4)
      • Work (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 인기 글

  • 태그

    자료구조
    플로이드 워셜
    sort
    투포인터
    구현
    bfs
    Java
    OS
    Deque
    K8s
    node scaling
    Stack
    dfs
    docker
    Pod Scheduling
    Karpenter
    BOJ
    priorityqueue
    cs
    EKS
  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ssu_dev
[JAVA] 백준 14940번 : 쉬운 최단거리
상단으로

티스토리툴바