[Programmers] - 거리두기 확인하기

문제

카카오 인턴십 문제를 풀어보자.

코드

import java.util.*;

class Solution {
    int[] nX = {0, 1, 0, -1, 1, 1, -1, -1, 0, 0, -2, 2};//우,하,좌,상,대각선
    int[] nY = {1, 0, -1, 0, 1, -1, -1, 1, 2, -2, 0, 0};//상하좌우 2칸씩
    int[] mX = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1};//상하좌우 2칸좌표 때
    int[] mY = {0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0};//파티션좌표
    
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        for(int i=0;i<5;i++) answer[i] = 1;
        
        int check;
        for(int i=0;i<5;i++){//테스트케이스
            check = 1;
            
            loop :
            for(int j=0;j<5;j++){//좌표
                for(int k=0;k<5;k++){
                    if(places[i][j].charAt(k)== 'P') {
                        if(rec(i,j,k,places) == 0)
                            check = 0;
                    }
                    if(check == 0) {
                        answer[i] = 0;
                        break loop;
                    }
                }
            }
        }r
        return answer;
    }
    
    int rec(int t, int x ,int y, String[][] arr){
        for(int i=0;i<12;i++){//상하좌우
            int xx = x+nX[i];//비교 좌표
            int yy = y+nY[i];
            if(xx > 4 || xx < 0) continue;//벽
            if(yy > 4 || yy < 0) continue;
            
            if(arr[t][xx].charAt(yy)=='P'){
                if(0 <= i && i < 4) return 0;//상하좌우
                
                else if(4 <= i && i < 8){//대각
                    if(arr[t][xx-nX[i]].charAt(yy)!='X' ||
                    arr[t][xx].charAt(yy-nY[i])!='X') return 0;
                }
               else{//2칸 상하좌우
                    if(arr[t][xx-mX[i]].charAt(yy-mY[i])!='X')
                        return 0;
                }
            }
        }
        return 1;
    }
}

코드 설명

맨해튼 거리 조건 없이 풀었다. 비교좌표를 상하좌우, 대각선, 상하좌우 2칸 이렇게 나누어 풀었다.

요약

  • 예상외로 0.03~0.07ms 정도 걸렸다.