100/100
1시간 반 이상
거리두기를 지키지 않는 시기를 배열로 순회하면서 찾으면 그때에 값을 나중에 확인해서 문제가 있는 것이면 리턴 값을 처리한다.
5*5 행렬이므로 효율성 문제는 순회하는데 거의 별일 없다고 판단
배열을 순회하면서 문제가 발생하는 경우를
IsDistancing
이라는 함수를 통해 체크를 진행하였다.
a[i][j]기준으로 a[i][j+1]이나 a[i][j+2]와 비교를 하는데
배열을 넘어서는 문제가 발생하거나 이를 해결해도
a[a.length-2][a.length-2]가 a[a.length-1][a.length-1] 같은 것을 확인 할 수 없는 상황이 발생했다.
기존에
5*5
를7*7
로 바꾸었다.
해당 추가되는 부분은 전부 파티션으로 처리하여5*5
와 결과에는 문제가 없이 처리했고 이를 통해 기존에5*5
의 뒤쪽부분에서 체크하지 못하는 것까지 쉽게 처리할 수 있다.
const IsDistancing = (places7x7, i, j, k) => {
if (places7x7[i][j][k] === "P") {
if (places7x7[i][j][k + 1] === "P" || places7x7[i][j + 1][k] === "P")
return false;
if (places7x7[i][j + 1][k + 1] === "P") {
if (places7x7[i][j + 1][k] === "O" || places7x7[i][j][k + 1] === "O")
return false;
}
if (places7x7[i][j + 2][k] === "P" && places7x7[i][j + 1][k] === "O")
return false;
if (places7x7[i][j][k + 2] === "P" && places7x7[i][j][k + 1] === "O")
return false;
} else if (places7x7[i][j][k] === "X") {
if (
places7x7[i][j][k + 1] === "P" &&
places7x7[i][j + 1][k] === "P" &&
places7x7[i][j + 1][k + 1] === "O"
)
return false;
} else if (places7x7[i][j][k] === "O") {
if (places7x7[i][j][k + 1] === "P" && places7x7[i][j + 1][k] === "P")
return false;
}
return true;
};
function solution(places) {
let rowArr = [];
let answer = [];
let isProblem = false;
let places7x7 = [...places];
places7x7 = places7x7.map((arr) => {
arr = arr.map((val) => {
val = val.concat("X");
val = val.concat("X");
return val;
});
arr.push("XXXXXXX");
arr.push("XXXXXXX");
return arr;
});
// 각각의 arr 실행
places.forEach((waitRoomArr, i) => {
isProblem = false;
// 5*5 행렬 waitRoomArr 실행
waitRoomArr.forEach((rows, j) => {
rowArr = [];
// 1~5행을 각각 실행 (크게만든 6,7행은 순회해도 의미가 없으니 순회하지않는다.)
isProblem = rows.split("").some((_, k) => {
rowArr.push(IsDistancing(places7x7, i, j, k));
return rowArr.indexOf(false) > -1;
});
});
if (isProblem) answer.push(0);
else answer.push(1);
});
return answer;
}
console.log(
solution([
["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"],
["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"],
["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"],
["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"],
["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"],
])
);
IsDistancing
은 해당 배열 위치값에서 거리두기를 하지 못했을때 false를 거리두기를 했을때 true를 리턴하여
해당 값들을 answer에 넣고 false가 존재한다면 해당 문제를 정리한다.
배열은 문제가 발생하는 때는 일차원배열이 undefined일때 이차원부분을 찾으려할때 Error가 발생한다.
let arr = [[],[],[],[]]
arr[100] //undefined
arr[1][100] //undefined
arr[4] //undefined
arr[5][100] //Error
일차원배열의 접근 가능한 [0][1][2][3]의 경우는 접근 가능하고
그외의 일차원 배열은 전부 undefined이다.
이차원배열의 경우 [0][1][2][3]을 제외한 부분에서 접근시
Error가 난다.
왜냐하면 arr[5]는 undefined인데 undefined의 100번째 배열을 찾으려하기 때문이다.