문제: https://school.programmers.co.kr/learn/courses/30/lessons/169199
import java.util.*;
class Solution {
static int[][] graph;
static boolean[][] visited;
static int[] dr = {-1,1,0,0}; // 상, 하, 좌, 우
static int[] dc = {0,0,-1,1};
static int rowLength;
static int columnLength;
// graph 경계 내에서 움직이고 장애물이 아닐 경우
public static boolean isValid(int r, int c){
return (r >=0 && r < rowLength) && ( c >= 0 && c < columnLength) && (graph[r][c] != 3);
}
public int solution(String[] board) {
// 저장할 int[][] 배열 생성
rowLength = board.length;
columnLength = board[0].length();
graph = new int[rowLength][columnLength];
visited = new boolean[rowLength][columnLength];
int startR = 0;
int startC = 0;
// String[]을 int[][]로 변환
// 시작점: 1, 도착점: 2, 장애물: 3
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length(); j++){
char current = board[i].charAt(j);
if(current == '.'){
graph[i][j] = 0;
} else if(current == 'R'){
graph[i][j] = 1; // 시작 위치
startR = i;
startC = j;
} else if(current == 'G'){
graph[i][j] = 2; // 도착 위치
} else if(current == 'D'){
graph[i][j] = 3; // 장애물 위치
}
}
}
int count = bfs(startR, startC); // 시작 위치
return count;
}
public static int bfs(int r, int c){
Queue<int[]> q = new ArrayDeque<>();
// 초기 세팅
q.offer(new int[]{r, c, 0}); // row, column, distance
visited[r][c] = true;
while(!q.isEmpty()){
int[] cur = q.poll();
int curRow = cur[0];
int curCol = cur[1];
int distance = cur[2];
// 도착지에 도착
if(graph[curRow][curCol] == 2){
return distance;
}
for(int i = 0; i < 4; i++){
int nextRow = curRow;
int nextCol = curCol;
// 한 방향으로 끝까지 이동
while(true){
int tempRow = nextRow + dr[i];
int tempCol = nextCol + dc[i];
if(!isValid(tempRow, tempCol)){
break;
}
nextRow = tempRow;
nextCol = tempCol;
}
if(!visited[nextRow][nextCol]){
q.offer(new int[]{nextRow, nextCol, distance + 1});
visited[nextRow][nextCol] = true;
}
}
}
return -1;
}
}
인접 리스트를 활용한 간단한 BFS를 보다가 격자로 이동하는걸 풀어보니 굉장히 어려웠다.
격자로 이동하는것과 친해져야겠다!
참 쉽쥬잉~?~?