https://school.programmers.co.kr/learn/courses/30/lessons/81302
맨해튼 거리
: 두 테이블 T1, T2가 행렬 (r1, c1), (r2, c2)에 각각 위치하고 있다면, T1, T2 사이의 맨해튼 거리는 |r1 - r2| + |c1 - c2| 입니다
public boolean isDistanced(char[][] room){
for(int i = 0; i < room.length; i++){
for(int j = 0; j < 5; j++){
if(room[i][j] != 'P')
continue;
if(!checkRoom(i, j, room))
return false;
}
}
return true;
}
2-1. 가고자 하는 좌표의 값이 P이면 (room[goX][goY] == 'P')이면 맨해튼 거리 1이기 때문에 바로 false 반환.
2-2. room[goX][goY] == 'O'라면 맨해튼 거리 2를 파악하기 위해 isNextP 함수로 한번 더 체크한다.
public boolean checkRoom(int x, int y, char[][] room){
for(int i = 0; i < 4; i++){
int goX = x + moveX[i];
int goY = y + moveY[i];
if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || room[goX][goY] == 'X')
continue;
if(room[goX][goY] == 'P')
return false;
else if(room[goX][goY] == 'O'){
if(isNextP(goX, goY, x, y, room)){
return false;
}
}
}
return true;
}
2-3. 이때 자신의 원래 좌표(P가 있던) 는 탐색을 하지 않아도 되기 때문에 if((goX == px && goY == py)) continue;
public boolean isNextP(int x, int y, int px, int py, char[][] room){
for(int i = 0; i < 4; i++){
int goX = x + moveX[i];
int goY = y + moveY[i];
if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || (goX == px && goY == py))
continue;
if(room[goX][goY] == 'P')
return true;
}
return false;
}
import java.util.*;
class Solution {
public static int[] moveX = {1, -1, 0, 0};
public static int[] moveY = {0, 0, 1, -1};
public int[] solution(String[][] places) {
int[] result = new int[places.length];
for(int i = 0; i < result.length; i++){
char room[][] = new char[5][5];
String [] place = places[i];
for(int j = 0; j < 5; j++){
room[j] = place[j].toCharArray();
}
if(isDistanced(room)){
result[i] = 1;
} else {
result[i] = 0;
}
}
return result;
}
public boolean isDistanced(char[][] room){
for(int i = 0; i < room.length; i++){
for(int j = 0; j < 5; j++){
if(room[i][j] != 'P')
continue;
if(!checkRoom(i, j, room))
return false;
}
}
return true;
}
public boolean checkRoom(int x, int y, char[][] room){
for(int i = 0; i < 4; i++){
int goX = x + moveX[i];
int goY = y + moveY[i];
if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || room[goX][goY] == 'X')
continue;
if(room[goX][goY] == 'P')
return false;
else if(room[goX][goY] == 'O'){
if(isNextP(goX, goY, x, y, room)){
return false;
}
}
}
return true;
}
public boolean isNextP(int x, int y, int px, int py, char[][] room){
for(int i = 0; i < 4; i++){
int goX = x + moveX[i];
int goY = y + moveY[i];
if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || (goX == px && goY == py))
continue;
if(room[goX][goY] == 'P')
return true;
}
return false;
}
}