안녕하세요. 오늘은 프로그램스의 거리두기 확인하기 문제를 풀어보겠습니다. 이 문제는 2021년 카카오 채용연계형 인턴십과정에서 출제되었습니다.
https://programmers.co.kr/learn/courses/30/lessons/81302
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을 찾았을 경우, O의 상 하 좌 우에 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만 생각하면 되는 문제였다. 항상 문제를 풀기 전 정확한 아이디어를 빠르게 생각하는게 중요한 것 같다.