대충이라도 하자

프로그래머스 - 거리두기 확인하기 본문

꼬꼬마 개발자 노트/Coding Problems

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

Sueeeeee
반응형

1. 처음에는 BFS를 사용할 방법을 생각하지 않았다.

어차피 5*5라는 크기가 정해져있어서 효율성에 대해서 생각하지 않았는데 아니나 다를까

정확성만 체크하는 문제인 듯하다. 하지만... 빼먹은 케이스가 있는지 90점이 나왔다.

또!!! 중요하게 봐야할 점이 있다. array out of index 오류가 발생하지 않도록 조건을 넣어줄 때,

무조건 변수의 범위는 if문에서 맨 앞에 위치시켜야 먼저 확인을 하고 그 다음 걸 확인할 수 있다.

만약에 if 문 후반부에 이 조건이 있으면 앞부분 array 확인 시, 오류가 발생해버림

이걸 찾지 못해서...ㅜㅜ

class Solution {
    static int[] answer;
    public int[] solution(String[][] places) {
        answer = new int[5];
       
        for(int i = 0;i<5;i++){
            char [][] room = new char[5][5];
            for(int j = 0;j<5;j++) {
                room[j]=places[i][j].toCharArray();
            }
            distance(room, i);
        }  
        return answer;
    }
    private void distance( char [][] room , int index) {
        for(int i = 0; i<5;i++){
            for(int j =0; j<5;j++){
                if(room[i][j] == 'P'){
                    //오른쪽, 왼쪽, 위, 아래 확인
                    if( (i<4 &&room[i+1][j] =='P') || (i>0 &&room[i-1][j] =='P') || 
                       (j<4 &&room[i][j+1] == 'P') || (j>0&&room[i][j-1] =='P' ) ){
                        answer[index] = 0;
                        return;
                    }
                    //+2칸째
                    if( (i<3 &&room[i+2][j] =='P' && room[i+1][j] !='X') || 
                       (i>1 &&room[i-2][j] =='P' && room[i-1][j] !='X') || 
                       (j<3 &&room[i][j+2] == 'P'&& room[i][j+1] != 'X') || 
                       (j>1 && room[i][j-2] =='P' && room[i][j-1] !='X' ) ){
                        answer[index] = 0;
                        return;
                    }
                    //대각선 확인
                    if(i>0 && j>0 && room[i-1][j-1] =='P'){
                        if((i>0 && room[i-1][j] !='X') && (j>0 && room[i][j-1] !='X')){
                            answer[index]=0;
                            return;
                        }
                    } 
                    if(i>0 && j<4 && room[i-1][j+1] =='P'){
                        if( (i>0 && room[i-1][j] !='X' )&&( j<4 &&room[i][j+1] !='X')){
                            answer[index]=0;
                            return;
                        }
                    }
                    
                    if(i<4 && j<4 && room[i+1][j+1] == 'P' ){
                        if( (i<4 && room[i+1][j] !='X')&& (j<4 && room[i][j+1] !='X')){
                            answer[index]=0;
                            return;
                        }
                    }
                   
                    if(i<4 && j>0 && room[i+1][j-1] =='P') {
                        if((i<4 && room[i+1][j] !='X' )&&(j>0 && room[i][j-1] !='X' )){
                            answer[index]=0;
                            return;
                        }
                       
                    }
                   
                }
            }
        }
        answer[index] =1;
    }//private
}

 

테스트 1 통과 (0.04ms, 76.2MB)
테스트 2 통과 (0.04ms, 76.3MB)
테스트 3 통과 (0.04ms, 80.6MB)
테스트 4 통과 (0.04ms, 81.3MB)
테스트 5 실패 (0.07ms, 76MB)
테스트 6 통과 (0.07ms, 74.1MB)
테스트 7 통과 (0.06ms, 75MB)
테스트 8 통과 (0.05ms, 75.2MB)
테스트 9 통과 (0.06ms, 75.4MB)
테스트 10 통과 (0.04ms, 76.6MB)
테스트 11 실패 (0.04ms, 79MB)
테스트 12 통과 (0.06ms, 67.6MB)
테스트 13 통과 (0.05ms, 75.5MB)
테스트 14 통과 (0.04ms, 73.2MB)
테스트 15 통과 (0.04ms, 76.6MB)
테스트 16 실패 (0.04ms, 76MB)
테스트 17 통과 (0.04ms, 74.5MB)
테스트 18 통과 (0.04ms, 75.2MB)
테스트 19 통과 (0.04ms, 77.6MB)
테스트 20 통과 (0.04ms, 68.6MB)
테스트 21 통과 (0.06ms, 74.5MB)
테스트 22 통과 (0.05ms, 74.6MB)
테스트 23 통과 (0.06ms, 75.6MB)
테스트 24 통과 (0.04ms, 78.1MB)
테스트 25 통과 (0.04ms, 77MB)
테스트 26 통과 (0.03ms, 68.5MB)
테스트 27 통과 (0.04ms, 76.6MB)
테스트 28 통과 (0.05ms, 76.5MB)
테스트 29 통과 (0.06ms, 73.9MB)
테스트 30 통과 (0.04ms, 82.8MB)

2. 갑자기 불현듯 깨달았다. 뭘 실수했는짘ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

내가 실수한 부분은 대각선 확인하는 부분에서 둘 중 하나가  'X'가 아니면 거짓인데

무조건 2가지 경우 다 'X'가 아닌 경우만 거짓이도록 출력을 설정....ㅜㅜㅜ

그래서 && 부분을 ||로 고쳐주었다. 이런 거 헷갈리지 않도록 조심하자

class Solution {
    static int[] answer;
    public int[] solution(String[][] places) {
        answer = new int[5];
       
        for(int i = 0;i<5;i++){
            char [][] room = new char[5][5];
            for(int j = 0;j<5;j++) {
                room[j]=places[i][j].toCharArray();
            }
            distance(room, i);
        }  
        return answer;
    }
    private void distance( char [][] room , int index) {
        for(int i = 0; i<5;i++){
            for(int j =0; j<5;j++){
                if(room[i][j] == 'P'){
                    //오른쪽, 왼쪽, 위, 아래 확인
                    if( (i<4 &&room[i+1][j] =='P') || (i>0 &&room[i-1][j] =='P') || 
                       (j<4 &&room[i][j+1] == 'P') || (j>0&&room[i][j-1] =='P' ) ){
                        answer[index] = 0;
                        return;
                    }
                    //+2칸째
                    if( (i<3 &&room[i+2][j] =='P' && room[i+1][j] !='X') || 
                       (i>1 &&room[i-2][j] =='P' && room[i-1][j] !='X') || 
                       (j<3 &&room[i][j+2] == 'P'&& room[i][j+1] != 'X') || 
                       (j>1 && room[i][j-2] =='P' && room[i][j-1] !='X' ) ){
                        answer[index] = 0;
                        return;
                    }
                    //대각선 확인
                    if(i>0 && j>0 && room[i-1][j-1] =='P'){
                        if((i>0 && room[i-1][j] !='X') || (j>0 && room[i][j-1] !='X')){
                            answer[index]=0;
                            return;
                        }
                    } 
                    if(i>0 && j<4 && room[i-1][j+1] =='P'){
                        if( (i>0 && room[i-1][j] !='X' )||( j<4 &&room[i][j+1] !='X')){
                            answer[index]=0;
                            return;
                        }
                    }
                    
                    if(i<4 && j<4 && room[i+1][j+1] == 'P' ){
                        if( (i<4 && room[i+1][j] !='X')|| (j<4 && room[i][j+1] !='X')){
                            answer[index]=0;
                            return;
                        }
                    }
                   
                    if(i<4 && j>0 && room[i+1][j-1] =='P') {
                        if((i<4 && room[i+1][j] !='X' )||(j>0 && room[i][j-1] !='X' )){
                            answer[index]=0;
                            return;
                        }
                       
                    }
                   
                }
            }
        }
        answer[index] =1;
    }//private
}

 

BFS방법으로도 한 번 풀어봐야 할 듯!

반응형
Comments