https://school.programmers.co.kr/learn/courses/30/lessons/81302#
import java.util.*;
class Node{
int r;
int c;
Node(int r, int c)
{
this.r = r;
this.c = c;
}
}
class Solution {
public int[] solution(String[][] places) {
//2이하 까지만 탐색
//x있으면 막힘처리
//하면서 다른P있는지 검사
int[] answer = new int[5];
for(int i = 0; i < places.length; ++i)
{
String[] wait = places[i];
char[][] map = new char[5][5];
for(int j = 0; j < 5; ++j)
{
String row = wait[j];
for(int k = 0; k < 5; ++k)
{
map[j][k] = row.charAt(k);
}
}
boolean rule = true;
for(int j = 0; j < 5; ++j)
{
for(int k = 0; k < 5; ++k)
{
if(map[j][k] == 'P')
{
if(false == bfs(new Node(j,k), map))
{
//System.out.println(j +","+k);
rule = false;
break;
}
}
}
if(rule==false)
break;
}
if(rule)
answer[i] = 1;
else
answer[i] = 0;
}
return answer;
}
public boolean bfs(Node start, char[][] map)
{
boolean[][] visit = new boolean[5][5];
Queue<Node> que = new LinkedList<Node>();
que.add(start);
visit[start.r][start.c] = true;
Queue<Integer> dist = new LinkedList<>();
dist.add(0);
int[][] dir = {{-1, 0},{0,1},{1,0},{0,-1}};
while(que.isEmpty()==false)
{
Node cur = que.poll();
int curDist = dist.poll();
if(curDist >= 2)
continue;
for(int i=0; i < 4; ++i)
{
int nr = cur.r + dir[i][0];
int nc = cur.c + dir[i][1];
if(nr < 0 || nr >=5 || nc <0 || nc >=5)
continue;
if(visit[nr][nc])
continue;
if(map[nr][nc] == 'X')
continue;
if(map[nr][nc] == 'P')
{
return false;
}
visit[nr][nc] = true;
que.add(new Node(nr, nc));
dist.add(curDist+1);
}
}
return true;
}
}