PPOOX
, POPXO
같은 경우는 미리 거르고 시작하고 싶다.
-> 해당 배열이 PP
나 POP
를 포함하면 바로 0을 return
POOOP
OOOPX
[0,4]를 체크했을 때 [1,3] 때문에 틀린다는 걸 return하기 때문에 [1,3]에서 [0,4]를 체크할 필요가 없다.
-> 먼젓번 행은 탐색할 필요가 없다.
POOPO
OOPOX
-> 먼젓번 열은 탐색할 필요가 있다.
∴ PP
, POP
를 거른 다음, 각 P마다 왼쪽 대각선
, 오른쪽 대각선
, 아래 2칸
까지만 탐색하면 된다.
function solution(places) {
const check = (i, j, place) => {
if (i < 4) {
if (place[i + 1][j] === "P") return false;
if (i < 3 && place[i + 1][j] === "O" && place[i + 2][j] === "P")
return false;
if (
j < 4 &&
place[i + 1][j + 1] === "P" &&
!(place[i + 1][j] === "X" && place[i][j + 1] == "X")
) {
return false;
}
if (
j > 0 &&
place[i + 1][j - 1] === "P" &&
!(place[i][j - 1] === "X" && place[i + 1][j] === "X")
) {
return false;
}
}
return true;
};
return places.reduce((acc, place) => {
// 만약 배열 중에 PP나 POP를 포함하는 자리가 있다면 바로 0을 return
if (place.some((s) => s.includes("PP") || s.includes("POP"))) {
acc.push(0);
return acc;
}
for (let i = 0; i < place.length; i++) {
for (let j = 0; j < place[i].length; j++) {
if (place[i][j] === "P") {
// 각 P마다 아래 2칸, 양 대각선 탐색
if (!check(i, j, place)) {
acc.push(0);
return acc;
}
}
}
}
acc.push(1);
return acc;
}, []);
}