Problem : https://programmers.co.kr/learn/courses/30/lessons/1844
Approach
아주 기본적인 BFS 문제이다.
BFS
를 구현할 줄 안다면 풀 수 있는 문제이다.
추가적인 스킬은 필요하지 않은 것 같다.
Code
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayDeque;
import java.util.Queue;
public class GameMapShortestDistance {
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static int row, col;
public int solution(int[][] maps) {
row = maps.length;
col = maps[0].length;
return bfs(maps);
}
static int bfs(int[][] maps) {
Queue<Point> q = new ArrayDeque<>();
boolean[][] visited = new boolean[row][col];
visited[0][0] = true;
q.offer(new Point(0, 0, 1));
while (!q.isEmpty()) {
Point cur = q.poll();
if (cur.x == row - 1 && cur.y == col - 1) {
return cur.cnt;
}
for (int i = 0; i < 4; i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
if (inRange(nx, ny) && maps[nx][ny] == 1 && !visited[nx][ny]) {
q.offer(new Point(nx, ny, cur.cnt + 1));
visited[nx][ny] = true;
}
}
}
return -1;
}
static boolean inRange(int x, int y) {
return x >= 0 && x < row && y >= 0 && y < col;
}
static class Point{
int x, y, cnt;
Point(int x, int y, int cnt) {
this.x = x;
this.y = y;
this.cnt = cnt;
}
}
@Test
void test() {
Assertions.assertEquals(11, solution(new int[][]{{1, 0, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 1}, {1, 1, 1, 0, 1}, {0, 0, 0, 0, 1}}));
Assertions.assertEquals(-1, solution(new int[][]{{1, 0, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 1}, {1, 1, 1, 0, 0}, {0, 0, 0, 0, 1}}));
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Java] 프로그래머스 (거리두기 확인하기) Level 2 (0) | 2021.08.09 |
---|---|
[Java] 프로그래머스 (다단계 칫솔 판매) Dev-Matching 3 (0) | 2021.07.31 |
[Java] 프로그래머스 (행렬 테두리 회전하기) Dev-Matching 2 (0) | 2021.07.31 |
[Java] 프로그래머스 (로또의 최고 순위와 최저 순위) Dev-Matching 1 (0) | 2021.07.31 |
[Java] 프로그래머스 (하노이의 탑) Level 3 (0) | 2021.02.24 |