[프로그래머스] 거리두기 확인하기

꿀이·2022년 6월 11일
0

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;
        };
    }
    
}
profile
내게 맞는 옷을 찾는중🔎

0개의 댓글