다익스트라 알고리즘, BFS 를 사용했다.
map(0,0) 에서 map(n-1,n-1) 로 가는 최소 거리가 아닌,
최소로 벽을 바꾸는 횟수를 출력해야한다.
처음에는 visited 배열로 최솟값을 갱신해주려고 했지만
그렇게 된다면 예를들어 50번만에 벽을 부수고 어딘가로 왔다면
그 위치에서 0~49개의 벽을 부숴서 도착한 visited 가 있는지 check 해줘야 한다. 최악의 경우에는 여기서 n이 50이니
50*50으로 2500번을 매번 이동할 때마다 확인해줘야 하므로
💡 boolean 형의 visited 대신, int 형으로 좌표에 온 최소값을 기록하고 있다가,
나보다 짧게 좌표에 온 경우가 있을 때 갱신해 줘야 한다.
👉 다익스트라 알고리즘의 개념
import java.util.*;
import java.io.*;
class Drill {
int y;
int x;
int drill;
Drill(int y,int x,int drill){
this.y=y;
this.x=x;
this.drill=drill;
}
}
public class Main {
static char map[][];
static int xx[]= {-1,1,0,0};
static int yy[]= {0,0,-1,1};
static int min[][];
public static void main(String[] args) throws IOException {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb=new StringBuilder();
int n=Integer.parseInt(br.readLine());
map=new char[n][n];
min=new int[n][n];
for(int i=0;i<n;i++) {
String word=br.readLine();
for(int j=0;j<n;j++) {
map[i]=word.toCharArray();
}
}
bfs();
System.out.println(min[n-1][n-1]);
}
public static void bfs() {
Queue<Drill> queue=new LinkedList<>();
for(int i=0;i<min.length;i++)
Arrays.fill(min[i],1000000);
//1은 흰방 0은 검은 방
if(map[0][0]=='0') {
queue.add(new Drill(0,0,1));
min[0][0]=1;
}
else {
queue.add(new Drill(0,0,0));
min[0][0]=0;
}
while(!queue.isEmpty()) {
Drill temp=queue.poll();
int prevY=temp.y;
int prevX=temp.x;
int drill=temp.drill;
for(int i=0;i<4;i++) {
int nextY=prevY+yy[i];
int nextX=prevX+xx[i];
if(nextY<0||nextX<0||nextY>=map.length||nextX>=map.length)
continue;
if(map[nextY][nextX]=='0'&&drill+1>=min[nextY][nextX])
continue;
if(map[nextY][nextX]=='1'&&drill>=min[nextY][nextX])
continue;
if(map[nextY][nextX]=='1') {
queue.add(new Drill(nextY,nextX,drill));
min[nextY][nextX]=drill;
}
else {
queue.add(new Drill(nextY,nextX,drill+1));
min[nextY][nextX]=drill+1;
}
}
}
}
}
첫 번째 제출 -> map을 int형으로 선언
두 번째 제출 -> map을 char형으로 선언
✨ map이 0 혹은 1 일 수밖에 없으니 char로 선언하는게 더 깔끔하다.
다익스트라 알고리즘을 2차원 배열에서 하는 건 처음이었는데
사실 알고리즘을 생각했을 때 최소값을 갱신해줘야 겠다고 생각만 했지
이게 다익스트라 알고리즘일거라고 생각하진 않고 풀었는데
풀고나서 다른 사람들 풀이 보니까 내가 한 것이 그냥 다익스트라 알고리즘을 쓴 거였다.
다익스트라 알고리즘
-> 시작 노드가 정해져 있을 때, 그 노드에서 다른 노드로 갈 때 최소 비용을 구하는 알고리즘 !
BFS 가 끝나고 min을 출력해 보면 실제로 다른 노드로 가는 최소 비용임을 알 수 있다!