나의 풀이
이 문제는 사소한 실수로 인해 3시간을 풀었다.
결국 테스트 케이스를 직접 9개 정도 만들고 나서 발견했다.
화살표함수를 사용했는데 return을 써주지 않아서 undefined이 계속 return되어서 되지 않았다.
그걸 찾았을 때 정말 허무했지만 그래도 기뻤다.
어떻게 하면 이런실수를 다음에 하지 않을까?
확실히 코드가 길어지고 복잡해지면 실수할 가능성이 너무 높아져서 조심해야한다.
그런다고 처음부터 리팩터링하면서 진행하면 까다로운 문제는 정말 오래걸려서 딜레마다.
일단은 최대한 주석은 많이 작성하고 간단한 것들은 함수화 해서 가독성을 높이는 방법밖에는 없는 것 같다.
풀이 과정
1️⃣ 대기실 안에 n번째 행에 면접자("P") 가없으면 continue isNotParticipantInRow()
2️⃣ 다음 조건을 충족 시키면 for문 중단후 result.push(0)
1) 동일 선상의 행에서 거리두기를 하지 않았을 때 isNotKeepingDistanceInRow() (ex : "PP", "POP")
2) "P"아래 "P"가 존재할 때 hasParticipantBelow()
3) "P"대각선에 칸막이없이 "P"가 존재할 때 isNotKeepingDistanceInDiagonal()
4) "P" 아래 "O" (빈 테이블)이면서 그 아래 "P"가 존재할 때 isBelowEmptyAndNextIsParticipant()
3️⃣ 2번을 충족시키지 못하면 모두 거리두기를 지키고 있기 때문에 result.push(1)
리팩 터링 후
function solution(places) {
const PARTICIPANT = 'P';
const result = [];
places.forEach((waitingRoom) => {
let isBreak = false;
for (let row = 0; row < waitingRoom.length; row++) {
if (isNotParticipantInRow(waitingRoom[row], PARTICIPANT)) continue;
if (isNotKeepingDistanceInRow(waitingRoom[row])) {
result.push(0);
isBreak = true;
break;
}
const participantIndexes = [...waitingRoom[row]].flatMap((element, index) =>
element === PARTICIPANT ? index : []
);
// 행 길이(대기실 개수)가 5이기 때문에
if (row < 4) {
if (hasParticipantBelow(participantIndexes, row, waitingRoom, PARTICIPANT)) {
result.push(0);
isBreak = true;
break;
}
if (isNotKeepingDistanceInDiagonal(participantIndexes, row, waitingRoom)) {
result.push(0);
isBreak = true;
break;
}
}
if (row < 3) {
if (isBelowEmptyAndNextIsParticipant(participantIndexes, row, waitingRoom)) {
result.push(0);
isBreak = true;
break;
}
}
}
if (!isBreak) result.push(1);
});
return result;
}
function isNotKeepingDistanceInRow(value) {
const firstCase = 'POP';
const secondCase = 'PP';
return value.indexOf(firstCase) !== -1 || value.indexOf(secondCase) !== -1;
}
function isNotParticipantInRow(value, PARTICIPANT) {
return ![...value].includes(PARTICIPANT);
}
function hasParticipantBelow(participantIndexes, row, waitingRoom, PARTICIPANT) {
return participantIndexes.some((value) => waitingRoom[row + 1][value] === PARTICIPANT);
}
function isNotKeepingDistanceInDiagonal(participantIndexes, row, waitingRoom) {
const PARTICIPANT = 'P';
const EMPTY = 'O';
// 'P' 아래가 'O'이면서 왼쪽 또는 오른쪽이 'P' 일 때
const firstCase = participantIndexes.some((value) => {
const isEmptyTable = waitingRoom[row + 1][value] === EMPTY;
const isParticipantOnLeft = waitingRoom[row + 1][value - 1] === PARTICIPANT;
const isParticipantOnRight = waitingRoom[row + 1][value + 1] === PARTICIPANT;
if ((isEmptyTable && isParticipantOnLeft) || (isEmptyTable && isParticipantOnRight)) {
return true;
}
});
// 오른쪽 or 왼쪽 O 이면서 그 아래가 P일때
const secondCase = participantIndexes.some((value) => {
const isEmptyTableOnRight = waitingRoom[row][value + 1] === EMPTY;
const isEmptyTableOnleft = waitingRoom[row][value - 1] === EMPTY;
const isDownThere = waitingRoom[row + 1][value + 1] === PARTICIPANT;
const isDownThere2 = waitingRoom[row + 1][value - 1] === PARTICIPANT;
if ((isEmptyTableOnleft && isDownThere2) || (isEmptyTableOnRight && isDownThere)) {
return true;
}
});
return firstCase || secondCase;
}
function isBelowEmptyAndNextIsParticipant(participantIndexes, row, waitingRoom) {
const PARTICIPANT = 'P';
const EMPTY = 'O';
return participantIndexes.some((value) => {
const isEmpty = waitingRoom[row + 1][value] === EMPTY;
const isParticipant = waitingRoom[row + 2][value] === PARTICIPANT;
if (isEmpty && isParticipant) return true;
});
}
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level.2 택배 배달과 수거하기 ⭐️⭐️ (0) | 2023.06.16 |
---|---|
[프로그래머스-JS] level.2 이모티콘 할인 행사 ⭐️⭐️ (0) | 2023.06.13 |
[프로그래머스] level.1 공원 산책 ⭐️ (0) | 2023.06.08 |
[프로그래머스-JS] level.1 신고 결과 받기 📌 (1) | 2023.06.07 |
[프로그래머스-JS] level.2 요격 시스템 📌 (0) | 2023.06.02 |