function solution(places) {
let result = [];
for (let i = 0; i < places.length; i++) {
if (getstart(places[i])) {
result.push(1);
} else {
result.push(0);
}
}
return result;
}
function getstart(p) {
let person = [];
for (let i = 0; i < p.length; i++) {
for (let j = 0; j < p[i].length; j++) {
if (p[i][j] === "P") {
person.push([i, j]);
}
}
}
let calcperson = [];
for (let i = 0; i < person.length - 1; i++) {
for (let j = i + 1; j < person.length; j++) {
if (Math.abs(person[i][0] - person[j][0]) + Math.abs(person[i][1] - person[j][1]) <= 2) {
calcperson.push(person[i]);
}
}
}
const inBound = (val) => val >= 0 && val < 5;
for (let i = 0; i < calcperson.length; i++) {
if (inBound(calcperson[i][0] - 1)) {
if (p[calcperson[i][0] - 1][calcperson[i][1]] === "P") return false;
if (p[calcperson[i][0] - 1][calcperson[i][1]] === "O") {
console.log("1");
if (
(inBound(calcperson[i][0] - 2) && p[calcperson[i][0] - 2][calcperson[i][1]] === "P") ||
(inBound(calcperson[i][1] - 1) && p[calcperson[i][0] - 1][calcperson[i][1] - 1] === "P") ||
(inBound(calcperson[i][1] + 1) && p[calcperson[i][0] - 1][calcperson[i][1] + 1] === "P")
) {
return false;
}
}
}
if (inBound(calcperson[i][1] + 1)) {
if (p[calcperson[i][0]][calcperson[i][1] + 1] === "P") return false;
if (p[calcperson[i][0]][calcperson[i][1] + 1] === "O") {
console.log("2");
if (
(inBound(calcperson[i][0] + 1) && p[calcperson[i][0] + 1][calcperson[i][1] + 1] === "P") ||
(inBound(calcperson[i][0] - 1) && p[calcperson[i][0] - 1][calcperson[i][1] + 1] === "P") ||
(inBound(calcperson[i][1] + 2) && p[calcperson[i][0]][calcperson[i][1] + 2] === "P")
) {
return false;
}
}
}
if (inBound(calcperson[i][0] + 1)) {
if (p[calcperson[i][0] + 1][calcperson[i][1]] === "P") return false;
if (p[calcperson[i][0] + 1][calcperson[i][1]] === "O") {
if (
(inBound(calcperson[i][0] + 2) && p[calcperson[i][0] + 2][calcperson[i][1]] === "P") ||
(inBound(calcperson[i][1] + 1) && p[calcperson[i][0] + 1][calcperson[i][1] + 1] === "P") ||
(inBound(calcperson[i][1] - 1) && p[calcperson[i][0] + 1][calcperson[i][1] - 1] === "P")
) {
return false;
}
console.log("3");
}
}
if (inBound(calcperson[i][1] - 1)) {
if (p[calcperson[i][0]][calcperson[i][1] - 1] === "P") return false;
if (p[calcperson[i][0]][calcperson[i][1] - 1] === "O") {
if (
(inBound(calcperson[i][1] - 2) && p[calcperson[i][0]][calcperson[i][1] - 2] === "P") ||
(inBound(calcperson[i][0] + 1) && p[calcperson[i][0] + 1][calcperson[i][1] - 1] === "P") ||
(inBound(calcperson[i][0] - 1) && p[calcperson[i][0] - 1][calcperson[i][1] - 1] === "P")
) {
return false;
}
console.log("4");
}
}
}
return true;
}
처리조건
풀이
1. 우선 각 단계 별로 처리하는 과정을 보이기 위해 P(사람이 앉는곳)을 찾기로 했다. getstart 함수에서 for문을 돌려 p로 받은 한 배치도의 배열을 입력 받는다. length 만큼 돌려서 P의 X,Y 좌표를 person 배열에 푸시한다.
2. person에는 P가 위치한 X,Y좌표가 들어가게 되고 다시 여기서 P를 차례로 서로간의 거리가 2이하인 것들만 calcperson에 담으려고 한다. length만큼 for문을 돌려 Math.abs로 절대값 계산을 하여 x는x끼리 y는y끼리 빼서 2이하인 경우의 P들만 calcperson에 담는다. 이때 돌리는 for문을 이중으로 하여 한번 서로간에 거리 계산이 된 것은 계산하지 않도록한다.
3. 2이하인 거리두기를 안지키고 있을 가능성이 있는 P들만 calcperson에 담기고 되고 이제 각 P마다 자신주변에 파티션이나 빈테이블 위치를 조사한다. P를 기준으로 주변에 X가 있으면 상관없지만 O가 있는곳은 O를 중심으로 아래 옆 총 3면을 검사하여 그중에 하나라도 P가있으면 FALSE를 리턴해야한다.
(2,1)좌표에 있는 P는 오른쪽으로 2칸에 P가 있으므로 calcperson에 있을것이다. 이P를 검사하게 되면 자신을 기준으로 왼쪽1칸(파란색) 아래쪽으로 한칸(파란색)에서 O가 검출되고 해당 파란색을 기준으로 3면인 빨간색네모를 검색해야한다. 빨간색 네모에 P가 나오는순간 false를 리턴하면된다. 내가 처음 작성한 로직중 P를 기준으로 위쪽면 O를 검사하는것인데 문제가 x축으로 2만큼 뺀 곳, y축으로 1을 더하거나 뺀 면의 P를 검사하게 되는데 만약 배열 밖에로 나가게되면 검사를 하면 안된다. 그래서 Inbound함수를 통해 해당 좌표의 x나 y축 숫자를 인자로 넣어 배열의 길이인 0이상 5미만에 들 경우 && 나머지 검사도 가능하도록 하였고 O의 자리에 P가 있는 경우도 있으니 해당부분도 return false하도록 하였다.
//배열의 길이를 생각하지 않은 잘못된 윗면 검사
if (p[calcperson[i][0] - 1][calcperson[i][1]] === "O") {
console.log("1");
if (
p[calcperson[i][0] - 2][calcperson[i][1]] === "P" ||
p[calcperson[i][0] - 1][calcperson[i][1] - 1] === "P" ||
p[calcperson[i][0] - 1][calcperson[i][1] + 1] === "P"
) {
return false;
}
}
'일반 학습 > 코딩 테스트' 카테고리의 다른 글
[프로그래머스] 튜플 (0) | 2022.03.07 |
---|---|
[프로그래머스] 수식 최대화 (0) | 2022.03.07 |
[프로그래머스] 뉴스 클러스터링 (0) | 2022.03.06 |
[프로그래머스] 괄호 변환 (0) | 2022.03.05 |
[프로그래머스] 문자열 압축 (0) | 2022.03.04 |
댓글