거리두기 확인하기

LJM·2023년 8월 22일
0

programmers

목록 보기
72/92

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;
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글