[알고리즘] 백준 > #6593. 상범 빌딩
문제링크
풀이방법
탈출까지 걸리는 최소시간을 묻기 때문에 너비우선탐색을 이용했습니다! 지금까지 다룬 다른 문제들과 달리 level이 추가되었는데요, 이차원으로 풀던 문제를 삼차원으로 바꾸면 됩니다! 기존엔 dy, dx만 가지고 풀 수 있었지만, 이 문제에서는 dl이라는 변수도 추가해 여섯 방향에 대해 탐색을 진행했습니다.
코드
class Solution {
final int[] dl = {0, 0, 0, 0, +1, -1};
final int[] dy = {+1, -1, 0, 0, 0, 0};
final int[] dx = {0, 0, +1, -1, 0, 0};
final int NOT_VISITED = 0;
final char DEST = 'E';
final char GOLD = '#';
int level;
int row;
int col;
Room startRoom;
char[][][] building;
public Solution(int level, int row, int col, Room startRoom, char[][][] building) {
this.level = level;
this.row = row;
this.col = col;
this.startRoom = startRoom;
this.building = building;
}
public int getMinTimeToEscape() {
int[][][] visited = new int[level][row][col];
Queue<Room> q = new LinkedList<>();
q.offer(startRoom);
int result = -1;
while (!q.isEmpty() && (result == -1)) {
Room head = q.poll();
for (int i = 0; i < 6; i++) {
Room nextRoom = new Room(head.level + dl[i], head.y + dy[i], head.x + dx[i]);
if (isInRange(nextRoom.level, nextRoom.y, nextRoom.x)
&& building[nextRoom.level][nextRoom.y][nextRoom.x] != GOLD
&& visited[nextRoom.level][nextRoom.y][nextRoom.x] == NOT_VISITED) {
visited[nextRoom.level][nextRoom.y][nextRoom.x] = visited[head.level][head.y][head.x] + 1;
q.offer(nextRoom);
if (building[nextRoom.level][nextRoom.y][nextRoom.x] == DEST) {
result = visited[nextRoom.level][nextRoom.y][nextRoom.x];
break;
}
}
}
}
return result;
}
private boolean isInRange(int l, int y, int x) {
return ((l >= 0) && (l < level) && (y >= 0) && (y < row) && (x >= 0) && (x < col));
}
}
class Room {
int level;
int y;
int x;
public Room(int level, int y, int x) {
this.level = level;
this.y = y;
this.x = x;
}
public Room() { }
}
Author And Source
이 문제에 관하여([알고리즘] 백준 > #6593. 상범 빌딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cchloe2311/알고리즘-백준-6593.-상범-빌딩저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)