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
문제풀이
BFS 문제였습니다.
다만, 지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)
이 값이 엄청나게 크기에 Scanner 로 값을 입력받으면 시간초과가 납니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); map[i][j] = Integer.parseInt(st.nextToken());
BufferedREader와 StringTokenizer를 사용해서 진행해야합니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int R, C, N; public static int[][] map; public static int[][] result; public static boolean[][] visited; public static Queue<Node> q = new LinkedList<>(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); // Scanner sc = new Scanner(System.in); // R = sc.nextInt(); // C = sc.nextInt(); map = new int[R][C]; result = new int[R][C]; visited = new boolean[R][C]; int startx=0, starty=0; for(int i=0;i<R;i++) { st = new StringTokenizer(br.readLine()); for(int j=0;j<C;j++) { // map[i][j] = sc.nextInt(); map[i][j] = Integer.parseInt(st.nextToken()); //2 지점을 큐에 넣고 BFS를 돌리기 위한 세팅을 합니다. if(map[i][j] == 2) { q.offer(new Node(i, j, 0)); result[i][j] = 0; startx=i; starty=j; } } } BFS(startx, starty); for(int i=0;i<R;i++) { for(int j=0;j<C;j++) { if(visited[i][j] == true || map[i][j] == 0) { System.out.print(result[i][j]+ " "); } else if(visited[i][j] == false && map[i][j] != 0) System.out.print("-1 "); } System.out.println(); } } public static void BFS(int startx, int starty) { int[] dx= {-1,1,0,0}; int[] dy= {0,0,-1,1}; result[startx][starty]= 0; visited[startx][starty] = true; while(!q.isEmpty()) { Node temp = q.poll(); int x = temp.r; int y = temp.c; int cnt = temp.cnt; for(int dir=0;dir<4;dir++) { int nx = x + dx[dir]; int ny = y + dy[dir]; if( nx < 0 || nx >= R || ny < 0 || ny >= C) continue; if( map[nx][ny] != 1) continue; if( visited[nx][ny] == true) continue; visited[nx][ny] = true; result[nx][ny] = cnt + 1; q.offer(new Node(nx, ny, cnt + 1)); } } } } class Node{ int r; int c; int cnt; public Node(int r, int c, int cnt) { this.r=r; this.c=c; this.cnt = cnt; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 7569 토마토 - BFS (0) | 2023.06.19 |
---|---|
[백준] 7576 토마토 - BFS (0) | 2023.06.18 |
[백준] 16918 봄버맨 - BFS (0) | 2023.06.17 |
[백준] 2667 단지번호붙이기 - BFS(넓이우선탐색) JAVA (0) | 2023.06.14 |
[백준] 2178 미로 탐색 - BFS(넓이우선탐색) JAVA (0) | 2023.06.12 |