문제 출저
https://www.acmicpc.net/problem/2665
2665번: 미로만들기
첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.
www.acmicpc.net
문제 풀이
(0,0) 지점에서 (n-1, n-1) 지점까지 이동하는데 0타일을 1타일로 바꾸는 갯수의 최소값을 구하는게 이 문제의 목표이다.
(0,0) 을 시작으로 BFS 탐색을 진행했다.
이 때, int[][] count 라는 2차원 배열을 만들어 이 지점을 지날 때 타일의 바꾼 횟수의 최소값을 계속 갱신하게 했다.
즉, count 배열에 기존에 기록된 값이 작아야 탐색을 계속 할 수 있는 것 이다.
이렇게 해서 목표 지점 (n-1, n-1) 탐색을 했고 count[n-1][n-1]을 정답으로 출력했다.
소스 코드
package baekjoon.backjoon9.day06;
/*
미로만들기
https://www.acmicpc.net/problem/2665
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class B2665 {
static int n;
static int[][] board;
static int[][] count;
static int INF = 987654321;
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, -1, 0, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
board = new int[n][n];
for(int i = 0; i < n; i++) {
String s = br.readLine();
for (int j = 0; j < n; j++) {
board[i][j] = (int) (s.charAt(j) - '0');
}
}
count = new int[n][n];
for(int i = 0; i < n; i++) {
Arrays.fill(count[i], INF);
}
count[0][0] = 0;
PriorityQueue<dot> pq = new PriorityQueue<>();
pq.add(new dot(0, 0, 0));
while (!pq.isEmpty()) {
dot d = pq.poll();
for (int i = 0; i < 4; i++) {
int ny = d.y + dy[i];
int nx = d.x + dx[i];
if (checkBoard(ny, nx)) {
// 벽을 만난 경우
if(board[ny][nx] == 0) {
if(count[ny][nx] > d.cost + 1) {
count[ny][nx] = d.cost + 1;
pq.add(new dot(ny, nx, d.cost + 1));
}
}
else if(board[ny][nx] == 1) {
if(count[ny][nx] > d.cost) {
count[ny][nx] = d.cost;
pq.add(new dot(ny, nx, d.cost));
}
}
}
}
}
StringBuilder sb = new StringBuilder();
sb.append(count[n-1][n-1]);
System.out.println(sb);
}
public static boolean checkBoard(int y, int x) {
if (y >= 0 && y < n && x >= 0 && x < n) {
return true;
}
return false;
}
// dot의 cost는 지나온 검을 길을 의미한다.
static class dot implements Comparable<dot> {
int y;
int x;
int cost;
dot(int y, int x, int cost) {
this.y = y;
this.x = x;
this.cost = cost;
}
public int compareTo(dot d) {
return this.cost - d.cost;
}
}
}