문제 보기
https://www.acmicpc.net/problem/2665
풀이
bfs에 다익스트라 논리를 적용하면 풀 수 있다.
특정 칸 까지 걸리는 최소 검은 방을 최단거리로 생각하면 된다.
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
Queue<int[]> q = new LinkedList<>();
int[][] dist = new int[N][N];
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
dist[i][j] = -1;
}
}
q.add(new int[]{0, 0, 0});
dist[0][0] = 0;
while(!q.isEmpty()) {
int[] cur = q.poll();
for(int k = 0; k < 4; k++) {
int x = cur[0] + dx[k];
int y = cur[1] + dy[k];
if(x < 0 || y < 0 || x >= N || y >= N) continue;
if(matrix[x][y]) {
if(dist[x][y] == -1 || dist[x][y] > cur[2] + 1) {
dist[x][y] = cur[2] + 1;
q.add(new int[]{x, y, dist[x][y]});
}
} else {
if(dist[x][y] == -1 || dist[x][y] > cur[2]) {
dist[x][y] = cur[2];
q.add(new int[]{x, y, dist[x][y]});
}
}
}
}
그래서 코드를 보면 별 게 없다.
dist 배열을 -1로 초기화 한다.
도착한 칸이 검은 방일 경우, 그 칸의 최소 검은 방이 현재 최소 검은 방 + 1보다 크면 갱신
흰 방일 경우 최소 검은 방이 현재 최소 검은 방보다 크면 갱신
-1 경우는 무조건 갱신이다.
간단한 다익스트라 논리를 적용해 풀었기 때문에 코드를 보면 바로 이해할 것 같다!
전체 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
boolean[][] matrix = new boolean[N][N];
for(int i = 0; i < N; i++) {
String line = br.readLine();
for(int j = 0; j < N; j++) {
matrix[i][j] = line.charAt(j) == '0';
}
}
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
Queue<int[]> q = new LinkedList<>();
int[][] dist = new int[N][N];
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
dist[i][j] = -1;
}
}
q.add(new int[]{0, 0, 0});
dist[0][0] = 0;
while(!q.isEmpty()) {
int[] cur = q.poll();
for(int k = 0; k < 4; k++) {
int x = cur[0] + dx[k];
int y = cur[1] + dy[k];
if(x < 0 || y < 0 || x >= N || y >= N) continue;
if(matrix[x][y]) {
if(dist[x][y] == -1 || dist[x][y] > cur[2] + 1) {
dist[x][y] = cur[2] + 1;
q.add(new int[]{x, y, dist[x][y]});
}
} else {
if(dist[x][y] == -1 || dist[x][y] > cur[2]) {
dist[x][y] = cur[2];
q.add(new int[]{x, y, dist[x][y]});
}
}
}
}
bw.write(dist[N - 1][N - 1] + "\n");
bw.flush();
bw.close();
}
}
GitHub 링크
'ProblemSolve > 항해99 코테스터디' 카테고리의 다른 글
99클럽 코테 스터디 17일차 TIL (챌린저): [백준][Java] 2056 작업 - 골드4 (0) | 2024.11.13 |
---|---|
99클럽 코테 스터디 16일차 TIL (챌린저): [백준][Java] 2179 비슷한 단어 - 골드4 (1) | 2024.11.12 |
99클럽 코테 스터디 14일차 TIL (미들러): [백준][Java] 14916 거스름돈 - 실버5 (0) | 2024.11.10 |
99클럽 코테 스터디 13일차 TIL (미들러): [백준][Java] 27961 고양이는 많을수록 좋다 - 브론즈1 (1) | 2024.11.09 |
99클럽 코테 스터디 12일차 TIL (챌린저): [프로그래머스][Java] 도넛과 막대 그래프 - level2 (3) | 2024.11.08 |