Lv 2. 거리두기 확인하기

2024. 9. 5. 17:28·Algorithm & Data Structures/Programers

import java.util.*;

class Solution {
    
    char[][] map;
    Queue<Node> q;
    boolean[][] isVisited;
    int[][] d = {{0,1},{1,0},{-1,0},{0,-1}};
    
    class Node{
        int x;
        int y;
        int dis;
        public Node(int x, int y, int dis){
            this.x = x;
            this.y = y;
            this.dis = dis;
        }
    }
    
    public int[] solution(String[][] places) {
        List<Integer> answer = new ArrayList<>();
        for(int i = 0 ; i < 5 ; i++){
            //확인 method
            map = new char[5][5];
            trans(places[i]);
            if(check()) answer.add(1);
            else answer.add(0);
        }
        return answer
            .stream()
            .mapToInt(Integer::intValue)
            .toArray();
    }
    
    // 확인용이한 char 2차원배열로 바꾸기
    public void trans(String[] place){
        for(int i = 0 ; i < 5 ; i++){
            for(int j = 0 ; j < 5 ; j++){
                map[i][j] = place[i].charAt(j);
            }
        }
    }
    //각 좌표확인 P확인되면 BFS 호출
    public boolean check(){
        for(int i = 0 ; i < 5 ; i++){
            for(int j = 0 ; j < 5 ; j++){
                if(map[i][j]=='P'){
                    if(!BFS(i,j)) //불합격시
                        return false;
                    else //호출결과 거리 2이하에 P 없으면 모든 P에 대하여 거리확보 좌표제거
                        map[i][j]='O';
                }
            }
        }
        return true;
    }
    //BFS로 각 P간의 거리를 확인해보는 method
    //거리가 1 인것만 q에 집어넣는다.
    //거리가 2 이하 하나라도 발견되면 바로 return false
    //좌표마다 초기화가 잘되어야함.
    public boolean BFS(int x, int y){
        isVisited = new boolean[5][5];
        q = new ArrayDeque<>();
        q.add(new Node(x,y,0));
        isVisited[x][y] = true;
        while(!q.isEmpty()){
            Node now = q.poll();
        
            if(map[now.x][now.y] == 'P' && now.dis != 0){ //거리 2이하만 넣었는데 2이하에 사람이 있다?
                return false; //불합격
            }
            
            isVisited[now.x][now.y] = true; //체크
            for(int i = 0 ; i < 4 ; i++){
                int afterX = now.x+d[i][0];
                int afterY = now.y+d[i][1];
                //벽넘었거나 들른곳이면 넘어가고
                if(afterX < 0 || afterX > 4 ||
                   afterY < 0 || afterY > 4 || 
                   isVisited[afterX][afterY] ||
                  map[afterX][afterY] == 'X') 
                    continue;
                //벽 안넘었고 들른곳도 벽도 아닌데 거리가 1이하면 바로 q에 집어넣기 
                else if(now.dis <= 1)
                    q.add(new Node(afterX,afterY,now.dis+1));
            }
        }
        return true; //합격
    }
    
}
//내생각에 모든 P를 찾아 BFS를 돌면서 다른 P를 찾는다.
//모든 P의 위치를 싹다 구한다? X 어차피 벽때문에 한번 더 검사해야함

//한대기실에 25개밖에안되니까 한번 싹다 확인해본다? ?
//각 P의 위치에서 맨해튼거리 2이하인곳만 벽없이 갈 수 있는지 확인해본다? O

//맨해튼거리 2이하란 x,y 좌표가 3이상 차이나야한다는소리 결론은 확인해볼곳은 그리 많지않다? 
//솔직히말해서 확인해볼곳이 총 내생각에 12자리밖에없다. 확인되면 map에서 지운다? 괜찮네

 

'Algorithm & Data Structures > Programers' 카테고리의 다른 글

Lv 2. 멀쩡한 사각형  (2) 2024.09.08
Lv 2. 가장 큰 정사각형  (4) 2024.09.06
Lv 2. 리코쳇 로봇  (0) 2024.09.04
Lv 2. 테이블 해시 함수  (0) 2024.09.03
Lv 2. 줄 서는 방법  (0) 2024.09.02
'Algorithm & Data Structures/Programers' 카테고리의 다른 글
  • Lv 2. 멀쩡한 사각형
  • Lv 2. 가장 큰 정사각형
  • Lv 2. 리코쳇 로봇
  • Lv 2. 테이블 해시 함수
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (315) N
      • Algorithm & Data Structures (237) N
        • BOJ (95) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    baekjoon
    후위순회
    dfs
    다익스트라
    Stack
    Union-Find
    programmers
    algorithm
    구현
    백트래킹
    투포인터
    골드
    동적계획법
    유니온파인드
    Java
    백준
    dp
    Dijkstra
    binarySearch
    프로그래머스
    PriorityQueue
    전위순회
    알고리즘
    SQL
    DynamicProgramming
    BFS
    스택
    이분탐색
    unionfind
    경로압축
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
Lv 2. 거리두기 확인하기
상단으로

티스토리툴바