문제 접근
- 전형적인 BFS 문제 같다.
- 시작점부터 시작해서 BFS 시작
- 그런데 자꾸 3%에서 틀렸다 나오길래 질문게시판을 찾아보았다.
메모리 초과
- 다시 같은 곳을 방문하지 않도록 방문 표시를 해주어야 한다. 안 그러면 Queue에 많은 좌표가 가득차게 된다.
틀렸습니다
- 도달할 수 없는 곳은 -1로 출력을 해야 한다. 이 처리를 안 해주면 3퍼에서 틀렸다고 나온다.
따라서 필자는 방문 표시를 isVisited 배열을 만드는 대신 방문한 곳은 map 값을 -1로 바꾸어주었고, 도달하지 못한 곳은 이 값이 아직 1로 남아있기 때문에 이를 처리해주었다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int[] rowDir = {1, -1, 0, 0};
static int[] colDir = {0, 0, 1, -1};
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int maxRow = Integer.parseInt(st.nextToken());
int maxCol = Integer.parseInt(st.nextToken());
map = new int[maxRow][maxCol];
int[][] distance = new int[maxRow][maxCol];
Queue<int[]> dq = new ArrayDeque<>();
for (int i = 0; i < maxRow; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < maxCol; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if (map[i][j] == 2) {
dq.offer(new int[]{i, j, 0});
}
}
}
while(!dq.isEmpty()) {
int[] current = dq.poll();
int currentDistance = current[2];
distance[current[0]][current[1]] = currentDistance;
for (int i = 0; i < 4; i++) {
int nextRow = current[0] + rowDir[i];
int nextCol = current[1] + colDir[i];
if (0 <= nextRow && nextRow < maxRow && 0 <= nextCol && nextCol < maxCol) {
if (map[nextRow][nextCol] == 1 && distance[nextRow][nextCol] == 0) {
map[nextRow][nextCol] = -1; // 방문 표시
dq.offer(new int[]{nextRow, nextCol, currentDistance + 1});
}
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < maxRow; i++) {
for (int j = 0; j < maxCol; j++) {
if (map[i][j] == 1) { // 도달할 수 없을 때
sb.append(-1).append(" ");
} else {
sb.append(distance[i][j]).append(" ");
}
}
sb.append("\n");
}
System.out.println(sb);
}
}
'Development > PS' 카테고리의 다른 글
[PS] 프로그래머스 [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 java 풀이 (14번에서 틀린 이유) (0) | 2024.10.16 |
---|---|
[PS] 프로그래머스 level 2 마법의 엘레베이터 java 풀이 (1) | 2024.10.07 |
[PS] 백준 18870 좌표 압축 java 풀이 (1) | 2024.09.25 |
[PS] 백준 가장 긴 바이토닉 부분 수열 java 풀이 (0) | 2024.09.21 |
[PS] 백준 1766 문제집 java 풀이 (0) | 2024.09.10 |