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

문제링크 🚩

https://school.programmers.co.kr/learn/courses/30/lessons/81302

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

📕 문제 접근 📕

 

다음과 같은 조건을 만족해야 한다.

 

대기실은 5개이며, 각 대기실은 5x5 크기
거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아야 한다.
단, 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용함

 

맨해튼 거리 1인 경우와 2인 경우를 분리하여 코드를 구성한다면 보다 쉽게 문제를 해결 할 수 있다.  

 

 

 

💻 Code 💻

class Solution {
    static final int size = 5;
    
    public int[] solution(String[][] places) {
        int[] answer = new int[size];
        
        int i = 0;
        for (String[] place : places) {
            answer[i++] = distance(place); 
        }
        return answer;
    }
    
    private static int distance(String[] place) {
        char[][] map = new char[size][size];
        
        for (int i = 0; i < size; i++) {
            map[i] = place[i].toCharArray(); 
        }
        
        return isPossible(map) ? 1 : 0;
    }
    
    private static boolean isPossible(char[][] map) {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (map[i][j] == 'P') {
                    if (!distanceManhattan(map, i, j)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
    
    private static boolean distanceManhattan(char[][] map, int x, int y) {
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, -1, 0, 1};
        
        for (int dir = 0; dir < 4; dir++) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];
            
            if (isValid(nx, ny) && map[nx][ny] == 'P') {
                return false;
            }
        }
        
        int[][] checkDist2 = {
            {-2, 0}, {2, 0}, {0, -2}, {0, 2}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}
        };
        
        for (int[] d : checkDist2) {
            int nx = x + d[0];
            int ny = y + d[1];
            
            if (isValid(nx, ny) && map[nx][ny] == 'P') {
                if (d[0] == 0) { 
                    if (map[x][(y + ny) / 2] != 'X') {
                        return false; 
                    }
                } else if (d[1] == 0) {  
                    if (map[(x + nx) / 2][y] != 'X') {
                        return false; 
                    }
                } else {
                    if (map[x][ny] != 'X' || map[nx][y] != 'X') {
                        return false; 
                    }
                }
            }
        }
        
        return true;
    }
    
    private static boolean isValid(int x, int y) {
        return x >= 0 && x < size && y >= 0 && y < size;
    }
}