나의 풀이
이전코드
function solution(n, lost, reserve) {
const realReserve = reserve.filter(r => !lost.includes(r));
const realLost = lost.filter(r => !reserve.includes(r));
// const reserveNum = reserve.lenght - realReserve.length;
const ableNum = realLost.filter(a => {
return realReserve.find((b, i) => {
const has = b === a-1 || b === a+1;
if (has) {
delete realReserve[i];
console.log(realReserve)
console.log(realReserve.length)
}
return has;
});
}).length;
return n - (realLost.length - ableNum);
}
현재 풀이
function solution(n, lost, reserve) {
sortAscendingOrder(lost, reserve); // 오름차순으로 정렬하기
[lost, reserve] = filterSameNumber(lost, reserve); // 여벌을 가지고 있지만 도난당한 학생들 제외
return n - (lost.length - borrow(lost, reserve)); // 전체 학생수 - (잃어버린 학생수 - 잃어버렸지만 빌린 학생수)
}
function sortAscendingOrder(lost, reserve) {
lost.sort((a, b) => a - b);
reserve.sort((a, b) => a - b);
}
function filterSameNumber(lost, reserve) {
const sameNumber = reserve.filter((student) => lost.includes(student));
const LostFiltered = lost.filter((number) => !sameNumber.includes(number));
const reserveFiltered = reserve.filter((number) => !sameNumber.includes(number));
return [LostFiltered, reserveFiltered];
}
// 변수보호를 위해 클로저 사용
// 읽어버렸지만 다른 학생에게 체유복을 빌린 학생수를 return 한다.
// 낮은 번호학생에게 빌리는 것을 우선으로 한다
// ex) lost = [3] reserve = [2,4] 4번 학생보다 2번 학생에게 먼저 빌리도록 설계
// findIndex를 사용한 이유는 조건문에서도 사용하고 splice에서도 사용하기 위해서이다.
const borrow = (function () {
let save = 0; // 체육복을 빌린 학생 수
return function (lost, reserve) {
lost.forEach((number) => {
const minus = number - 1; // 이전 번호
const plus = number + 1; // 다음 번호
const indexIfBorrow = reserve.findIndex((num) => num === minus); // 빌렸다면 누구에게 빌렸는지 index return
const indexIfBorrowOfPlus = reserve.findIndex((num) => num === plus);
if (indexIfBorrow !== -1) {
reserve.splice(indexIfBorrow, 1); // 빌리는데 성공했다면 빌려준 학생 번호 reserve에서 제거
save += 1; // 체육복을 빌린 학생 수 + 1
} else if (indexIfBorrowOfPlus !== -1) {
reserve.splice(indexIfBorrowOfPlus, 1);
save += 1;
}
});
return save; // forEach 문이 끝나면 잃어버렸지만 체육복을 빌린 학생 수 return
};
})();
다른 사람 풀이
function solution(n, lost, reserve) {
return n - lost.filter(a => {
const b = reserve.find(r => Math.abs(r-a) <= 1)
if(!b) return true
reserve = reserve.filter(r => r !== b)
}).length
}
이렇게 푸신 분이 있어서 "와우" 했는데 지금은 오답입니다.
앞번호 학생에게 먼저 빌려야하는데 뒷 번호 학생에게 먼저 빌릴 수 있습니다.
또한 여벌은 있지만 도난당한 학생은 고려가 되지 않았습니다.
다만 Math.abs(r-a) 이 부분은 정말 좋은 것 같습니다.
따라서 제가 푸는 방법을 추가하여 수정해보았습니다.
function solution(n, lost, reserve) {
const NONEXISTENT = -1
const lostNonDuplicated = lost.filter(l=> !reserve.includes(l) ).sort((pre,cur)=>pre-cur);
let reserveNonDuplicated = reserve.filter(r=> !lost.includes(r) ).sort((pre,cur)=>pre-cur);
return n - lostNonDuplicated.filter(borrower => {
const indexOfStudentCanLend = reserveNonDuplicated.findIndex(lender => Math.abs(lender-borrower) === 1)
if(indexOfStudentCanLend === NONEXISTENT) return true
reserveNonDuplicated.splice(indexOfStudentCanLend, 1)
}).length;
}
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스] level.2 전력망을 둘로 나누기 ★★ (0) | 2023.04.14 |
---|---|
[프로그래머스] level.1 삼총사 (0) | 2023.04.13 |
[프로그래머스 - JS] level.1 둘만의 암호 (0) | 2023.02.09 |
[프로그래머스 - JS] level.1 다트 게임 (0) | 2023.01.31 |
[프로그래머스] level.1 이상한 문자 만들기 (0) | 2023.01.28 |