https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
문제설명
목적지를 향해 미로를 탐색하여 이동할 때 지나야 하는 최소 칸수를 구한다.
문제 해결 방법
BFS로 풀었다.
코드 구현
import java.io.BufferedReader;
import java.awt.Point;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static int N, M;
public static int[] dx = {-1, 0, 1, 0};
public static int[] dy = {0, -1, 0, 1};
public static int[][] graph;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
//1,1에서 출발
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new int[N][M];
for(int i = 0; i<N; i++) {
Arrays.fill(graph[i], 0);
}
//N, M 위치로 이동
for(int i = 0; i < N; i++) {
String str = br.readLine();
for(int j = 0; j < M; j++) {
graph[i][j] = Character.getNumericValue(str.charAt(j));
}
}
bfs();
System.out.println(graph[N-1][M-1]);
// BFS
}
public static void bfs() {
Queue<Point> q = new LinkedList<Point>();
q.add(new Point(0,0));
while(!q.isEmpty()) {
Point p = q.poll();
for(int i = 0; i < 4; i++) {
int x = p.x + dx[i];
int y = p.y + dy[i];
if(x<0 || y<0 || x>=N || y>=M) {
continue;
}
if(graph[x][y] == 1) {
q.add(new Point(x, y));
graph[x][y]=graph[p.x][p.y]+1;
}
}
}
}
}
시간/공간 복잡도
O(N^2)
최적화 및 개선
하지않음
어려웠던 점
좌표를 어떻게 저장해야할까 고민을 많이 하다가
구글링해서 Point를 사용하여 문제를 해결했다.
'코딩테스트 > 문제 풀이 - Java' 카테고리의 다른 글
[프로그래머스 lv1]두 개 뽑아서 더하기 (0) | 2024.03.08 |
---|---|
[백준2667] 단지번호붙이기 (0) | 2024.03.06 |
[백준2606] 바이러스 (0) | 2024.03.05 |
[백준1260] DFS와 BFS (0) | 2024.03.04 |