본문 바로가기
문제 풀이/백준

[JAVA 01] 2178. 미로찾기

by hyeminigo 2024. 8. 27.

2178. 미로찾기 (S1) 

시간 제한 메모리 제한  제출 정답 맞힌 사람 정답
1 초 192 MB 211768 97792 61944 44.611%

 

문제

 

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

입력

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

 


 

summary

(1,1) 부터 (N,M) 까지 최소 이동 칸 수 구하기.

 

- 서로 인접한 칸만 이동 가능

- (N,M) 항상 도착 가능

 

strategy

최소 이동 거리를 구하기 위해서 완전탐색 방법 중 너비 우선 탐색(Queue)으로 진행. 

 

- 이미 방문한 곳 여부 체크 (visited)

- 이동 칸수 체크 (visited)

- 벽인지 체크 (map)

note

- N, M(2 ≤ N, M ≤ 100)

 

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

public class Main {
    
    static int dir[][] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    
    static int N = 0, M = 0, answer = 0;
    static int[][] map;
    static int [][] visited;
    
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        /* input */
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        map = new int[N][M];
        visited = new int[N][M];

        for (int n = 0; n < N; n++) {
            String[] s = br.readLine().split("");
            for (int m = 0; m < M; m++) {
                map[n][m] = Integer.parseInt(s[m]);
            }
        }

        /* logic */
        answer = BFS();
        
        /* output */
        System.out.println(answer); 

        br.close();
    }

    public static int BFS() {
        Queue<Point> q = new ArrayDeque<>();
        
        visited[0][0] = 1;
        q.add(new Point(0,0));
        

        while(!q.isEmpty()) {
            Point current = q.poll();
            
            for(int[] d : dir) {
                int mx = current.x + d[0];
                int my = current.y + d[1];

                if(mx < 0 || mx >= N || my < 0 || my >= M) continue; // map index range
                if(map[mx][my] == 0 || visited[mx][my] != 0) continue; // 벽, 방문 여부 확인

                visited[mx][my] = visited[current.x][current.y] + 1; // 방문처리
                q.add(new Point(mx, my)); 
            }

            if(current.x == N-1 && current.y == M-1) break; // 도착 했으면 즉시 종료
        }
        return visited[N-1][M-1];
    }
}

 

문제 결과 메모리 시간 언어코드 길이
 2178 맞았습니다!! 16596 156  Java 11 / 수정 1831

 

 

MEMO

- BFS 에서 while(q,isEmpty())  실수 주의  > while(!q,isEmpty()) 

- 시작점도 방문 처리 까먹지 말기

'문제 풀이 > 백준' 카테고리의 다른 글

[JAVA06] 1764. 듣보잡  (0) 2024.09.02
[JAVA05] 1620. 나는야 포켓몬 마스터 이다솜  (2) 2024.08.31
[JAVA04] 2529. 부등호  (0) 2024.08.30
[JAVA 03] 1697. 숨바꼭질  (0) 2024.08.29
[JAVA 02] 2579. 계단 오르기  (0) 2024.08.27