[Programmers] - 거리두기 확인하기
문제
카카오 인턴십 문제를 풀어보자.
코드
import java.util.*;
class Solution {
int[] nX = {0, 1, 0, -1, 1, 1, -1, -1, 0, 0, -2, 2};//우,하,좌,상,대각선
int[] nY = {1, 0, -1, 0, 1, -1, -1, 1, 2, -2, 0, 0};//상하좌우 2칸씩
int[] mX = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1};//상하좌우 2칸좌표 때
int[] mY = {0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0};//파티션좌표
public int[] solution(String[][] places) {
int[] answer = new int[5];
for(int i=0;i<5;i++) answer[i] = 1;
int check;
for(int i=0;i<5;i++){//테스트케이스
check = 1;
loop :
for(int j=0;j<5;j++){//좌표
for(int k=0;k<5;k++){
if(places[i][j].charAt(k)== 'P') {
if(rec(i,j,k,places) == 0)
check = 0;
}
if(check == 0) {
answer[i] = 0;
break loop;
}
}
}
}r
return answer;
}
int rec(int t, int x ,int y, String[][] arr){
for(int i=0;i<12;i++){//상하좌우
int xx = x+nX[i];//비교 좌표
int yy = y+nY[i];
if(xx > 4 || xx < 0) continue;//벽
if(yy > 4 || yy < 0) continue;
if(arr[t][xx].charAt(yy)=='P'){
if(0 <= i && i < 4) return 0;//상하좌우
else if(4 <= i && i < 8){//대각
if(arr[t][xx-nX[i]].charAt(yy)!='X' ||
arr[t][xx].charAt(yy-nY[i])!='X') return 0;
}
else{//2칸 상하좌우
if(arr[t][xx-mX[i]].charAt(yy-mY[i])!='X')
return 0;
}
}
}
return 1;
}
}
코드 설명
맨해튼 거리 조건 없이 풀었다. 비교좌표를 상하좌우, 대각선, 상하좌우 2칸 이렇게 나누어 풀었다.
요약
- 예상외로 0.03~0.07ms 정도 걸렸다.