본문으로 바로가기

2021 카카오 채용연계형 인턴십 


거리두기 확인하기

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

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

bfs로도 풀이할 수 있겠다고 생각했지만, 나는 조금 더 심플하게 생각했다.

 

for(int i = 0; i<5; i++)

  for(int j = 0; j<5; j++)

 

의 이중 포문의 형태로 0,0 부터 사람이 앉아있는 것을 확인했을 때 주변을 확인한다고 가정했을 때, 실제로 확인해야하는 블록의 형태는 

이런 구조를 갖게 된다. 이 중, P가 아예 있어선 안되는 위치를 표시한다면

이러하고, 나머지는 파란색 블록으로 향하는 길이 모두 펜스로 막혀있어야만 한다.

이러한 조건을 직접 작성한다면

import java.util.*;

class Solution {
    public int[] solution(String[][] places) {
        int idx = 0;
        int[] answer = new int[5];
        for(String[] place : places){
            if(check(place)){
                answer[idx++] = 1;
            }else{
                answer[idx++] = 0;
            }
        }
        return answer;
    }
    
    public boolean check(String[] place){
        char[][] room = new char[5][5];
        for(int i = 0; i<5; i++){
            room[i] = place[i].toCharArray();
        }
        for(int i = 0; i<5; i++){
            for(int j = 0; j<5; j++){
                if(room[i][j]=='P'){
                    if(!isFine(i, j, room)){
                        return false;
                    }
                }
            }
        }
        return true;
    }
    
    public boolean isFine(int x, int y, char[][] room){
        if(x+1<5 && room[x+1][y]=='P'){
            return false;
        }
        if(y+1<5 && room[x][y+1]=='P'){
            return false;
        }
        if(x+2<5 && room[x+2][y]=='P' && room[x+1][y] =='O'){
            return false;
        }
        if(y+2<5 && room[x][y+2]=='P' && room[x][y+1] =='O'){
            return false;
        }
        if(x+1<5 && y+1<5 &&room[x+1][y+1]=='P'){
            if(room[x][y+1]=='O'||room[x+1][y]=='O'){
                return false;
            }
        }
        if(x-1>=0 && y+1<5 &&room[x-1][y+1]=='P'){
            if(room[x][y+1]=='O'||room[x-1][y]=='O'){
                return false;
            }
        }
        return true;
    }
}

이런 구조로 코드를 작성할 수 있다.