[프로그래머스(Programmers)] 거리두기 확인하기 (java) /2021 카카오 채용연계형 인턴십

2
post-thumbnail

안녕하세요. 오늘은 프로그램스의 거리두기 확인하기 문제를 풀어보겠습니다. 이 문제는 2021년 카카오 채용연계형 인턴십과정에서 출제되었습니다.


문제 링크

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

문제 풀이

✔ places 배열을 char 이중 배열로 나눈 후 저장

places[0] = {"POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"} 을 char[][] map = {'P','O','O','O','P'}, {'O','X','X','O','X'}, {'O','P','X','P','X'}, {'O','O','X','O','X'}, {'P','O','X','X','P'} 이렇게 이중 배열로 나눠서 저장합니다.

✔ O(테이블), P(사람) 찾기

O을 찾았을 경우

O을 찾았을 경우, O의 상 하 좌 우에 P가 두 개 이상 있으면 거리두기를 지키지 않은 대기실입니다.

P를 찾았을 경우

P를 찾았을 경우, P의 상 하 좌 우에 P가 하나라도 더 있으면 거리두기를 지키지 않은 대기실입니다.

전체 코드

class Solution {
    public int[] solution(String[][] places) {
        int[] answer = new int[places.length];
        int idx = 0;
        
        for(String[] str : places) {
            map = new char[5][5];
            row = map.length;
            col = map[0].length;
            
            for(int i = 0; i < str.length; i++) {
                map[i] = str[i].toCharArray();
            }
                
            if(isWellSeated()) {
                answer[idx] = 1;
            } else {
                answer[idx] = 0;
            }

            idx++;
            
        }
        return answer;
    }
    
    private char[][] map;
    private int row;
    private int col;
    private int[] dr = {-1, 1, 0, 0};
    private int[] dc = {0, 0, -1, 1};
        
    private boolean isWellSeated() {
        
        for(int r = 0; r < row; r++) {
            for(int c = 0; c < col; c++) {
                if(map[r][c] == 'O' && checkAround(r, c) >= 2) {
                    return false;
                } else if (map[r][c] == 'P' && checkAround(r, c) >= 1) {
                    return false;
                }
            }
        }
        
        return true;
    }
    
    private int checkAround(int r, int c) {
        int numberOfP = 0;
                    
        for(int d = 0; d < 4; d++) {
            int nr = r + dr[d];
            int nc = c + dc[d];

            if(nr < 0 || nc < 0 ||nr >= row || nc >= col) continue;

            if(map[nr][nc] == 'P') numberOfP++;
        }
        
        return numberOfP;
    }
}

느낀점

문제에서 주어진 내용들을 곧이곧대로 해석하지 말고, 어떻게 풀어야 좋을지를 정확히 생각하는 게 중요하다고 느꼈다. 파티션인 X는 전혀 생각할 필요가 없고 O와 P만 생각하면 되는 문제였다. 항상 문제를 풀기 전 정확한 아이디어를 빠르게 생각하는게 중요한 것 같다.

0개의 댓글