개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
맨허튼 거리에 포함되는 거리
맨허튼 거리에 포함되지만 허용되는 경우
위의 경우는 응시자를 기준으로 정한 것. 관점을 조금 바꿔서 빈 테이블과 파티션도 포함해서 생각해보면,
파티션을 제외하고 빈 테이블, 응시자에 대한 주변검증으로 문제를 해결하면 된다.
public class CheckDistance {
public int[] solution(String[][] places) {
int[] answer = new int[5];
for(int i = 0; i < places.length; i++){
answer[i] = solution(places[i]); // places를 한줄씩 연산
}
return answer;
}
public int solution(String[] place){
String[][] detail = convertToPlaceDetail(place); //place를 2차원 배열로 변환
// P일 때 주변이 P면 실패, O일 때 주변에 P가 2개면 실패
for(int i = 0; i < detail.length; i++){
for(int j = 0; j < detail[i].length; j++){
int sum = detail[i][j].equals("P") ? 1: 0; //자기 자신이 P면 1부터 시작
if(detail[i][j].equals("X")) continue;
//상
if(i > 0){
sum += detail[i-1][j].equals("P") ? 1 : 0;
}
//하
if(i < detail.length - 1){
sum += detail[i+1][j].equals("P") ? 1 : 0;
}
//좌
if(j > 0){
sum += detail[i][j-1].equals("P") ? 1 : 0;
}
//우
if(j < detail[i].length - 1){
sum += detail[i][j+1].equals("P") ? 1 : 0;
}
if(sum >= 2){
return 0;
}
}
}
return 1;
}
public String[][] convertToPlaceDetail(String[] place) { //place를 2차원 배열로 변환
String[][] detail = new String[5][5];
for(int i = 0; i < place.length; i++){
String element = place[i];
for(int j = 0; j < element.length(); j++){
detail[i][j] = element.charAt(j)+"";
}
}
return detail;
}
}
문제들은 가끔 많은 내용을 제공하는 척 하면서 문제풀이를 더 복잡하게 하는 것 같다. (Feat.맨허튼 거리)