プログラマレベル2)距離チェック
リンク:グリズリー式ピストル2)
質問する
|r1-r2|+|c1-c2|>2.
出力:距離が完全に保持されている場合は、1または0を返します.
に答える
この問題はcotteでやった問題です~
簡単に解けそう
問題を見ればDFSタイプだとわかります.
文は順番に待合室を回っているからです.
このとき受験者のいるラウンジを見つけたらDFSを回します.
受験者座標を上下左右に移動します.
上下左右座標
Xなら行く必要がないので帰ってきました.
Pの場合は、距離が2より小さいことを確認し、2より小さい場合は距離を保持できないため、前のメソッドに戻り、0を返します.
※ここで注意したいのは、|r 1-r 2|+|c 1-c 2|=0の場合、自分の身分で0を返すことはできません.
インプリメンテーション
class Solution {
static int ok;
public static void dfs(int N, int j, int k, int x, int y, String[] places, boolean[][] check) {
if (x < 0 || x >= N || y < 0 || y >= N)
return;
if (places[x].charAt(y) == 'X')
return;
if (check[x][y] == true)
return;
if (Math.abs(j - x) + Math.abs(k - y) > 2)
return;
if (Math.abs(j - x) + Math.abs(k - y) != 0 && places[x].charAt(y) == 'P') {
ok = 0;
return;
}
check[x][y] = true;
dfs(N, j, k, x + 1, y, places, check);
dfs(N, j, k, x - 1, y, places, check);
dfs(N, j, k, x, y + 1, places, check);
dfs(N, j, k, x, y - 1, places, check);
}
public static int checkPlace(String[] places, int N) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
boolean[][] check = new boolean[N][N];
if (places[i].charAt(j) == 'P') {
ok = 1;
dfs(N, i, j, i, j, places, check);
if (ok == 0)
return 0;
}
}
}
return 1;
}
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
int N = 5;
for (int i = 0; i < places.length; i++)
answer[i] = checkPlace(places[i], N);
return answer;
}
}
Reference
この問題について(プログラマレベル2)距離チェック), 我々は、より多くの情報をここで見つけました https://velog.io/@yuiopre98/프로그래머스-level2-거리두기-확인하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol