https://programmers.co.kr/learn/courses/30/lessons/81302
2차원 배열을 돌면서 player 가 나오면 그 위치에서 bfs를 돌렸다. bfs 의 거리는 두칸까지만 봤다.(어차피 두칸만 보면 되니까) 그리고 칸막이가 나오면 그칸은 Queue에 넣어주지 않고 continue 했다.
import java.util.*;
class Solution {
public int[] solution(String[][] places) {
int[] answer = new int[5];
for(int i = 0 ; i< 5 ; i++){
if(solve(places[i])){
answer[i] = 1;
}
}
return answer;
}
public boolean solve(String[] map){
for(int i = 0 ; i< 5 ; i++){
for(int j = 0 ; j< 5 ; j++){
if(map[i].charAt(j) == 'P'){
if(!bfs(map,i,j)) return false;
}
}
}
return true;
}
public boolean bfs(String[] map,int y,int x){
int[][] visited = new int[5][5];
Queue<Node> q = new LinkedList<>();
int[] dy = {0,0,1,-1};
int[] dx = {1,-1,0,0};
visited[y][x] = 1;
q.add(new Node(y,x));
while(!q.isEmpty()){
int cy = q.peek().y;
int cx = q.peek().x;
int dist = visited[cy][cx];//와나.. 여길 왜 못봤지.. y,x 로 해놨었네
q.remove();
for(int i = 0 ; i< 4 ; i++){
int ny = cy + dy[i];
int nx = cx + dx[i];
int ndist = dist + 1;
if(ny < 0|| nx < 0|| ny >= 5 || nx >= 5) continue;
if(visited[ny][nx] != 0) continue;
if(map[ny].charAt(nx) == 'X') continue;
if(map[ny].charAt(nx) == 'P' && ndist <=3) return false;
visited[ny][nx] = ndist;
if(dist < 2) q.add(new Node(ny,nx));
}
}
return true;
}
public class Node{
int y;
int x;
Node(){};
Node(int y, int x){
this.y = y;
this.x = x;
};
}
}