https://school.programmers.co.kr/learn/courses/30/lessons/169199
기본 bfs 문제에 델타를 1칸 이동 -> 갈 수 있는 데까지 이동으로 바꾼 형식이었다.
import java.util.*;
class Solution {
public int solution(String[] board) {
int answer = 0;
int R = board.length;
int C = board[0].length();
int gr=0, gc=0, rr=0, rc=0;
int[] dr = {0,0,1,-1};
int[] dc = {1,-1,0,0};
char[][] map = new char[R][C];
boolean[][] vst = new boolean[R][C];
for(int i=0; i<R; i++) {
String b = board[i];
for(int j=0; j<C; j++) {
char c = b.charAt(j);
map[i][j] = c;
if(c == 'G') {
gr = i;
gc = j;
}
else if(c == 'R') {
rr = i;
rc = j;
}
}
}
Queue<int[]> q = new ArrayDeque<>();
q.offer(new int[]{rr, rc, 0});
vst[rr][rc] = true;
while(!q.isEmpty()) {
int[] info = q.poll();
int r = info[0];
int c = info[1];
int m = info[2];
if(r == gr && c == gc) {
answer = m;
break;
}
for(int i=0; i<4; i++) {
int tr = r;
int tc = c;
switch(i) {
case 0 : {
while(tc + dc[i] < C && map[tr][tc + dc[i]] != 'D') {
tc += dc[i];
}
break;
}
case 1 : {
while(tc + dc[i] >= 0 && map[tr][tc + dc[i]] != 'D') {
tc += dc[i];
}
break;
}
case 2 : {
while(tr + dr[i] < R && map[tr + dr[i]][tc] != 'D') {
tr += dr[i];
}
break;
}
case 3 : {
while(tr + dr[i] >= 0 && map[tr + dr[i]][tc] != 'D') {
tr += dr[i];
}
}
}
if(!vst[tr][tc]) {
vst[tr][tc] = true;
q.offer(new int[]{tr,tc,m+1});
}
}
}
return answer == 0 ? -1 : answer;
}
}
'[프로그래머스] PS > Java' 카테고리의 다른 글
[lv2] 파일명 정렬 (1) | 2024.12.19 |
---|---|
[lv3] 외벽 점검 (0) | 2024.12.16 |
[lv2] 방금그곡 (0) | 2024.12.15 |
[lv2] 줄 서는 방법 (1) | 2024.12.15 |
[lv2] 배달 (0) | 2024.12.13 |