프로그래머스. 코딩테스트 고득점 Kit.
탐욕법(Greedy). 1단계
function solution(n, lost, reserve) {
let answer = 0;
// 체육복을 도난당하고 여벌이 없는 학생(여벌 받아야하는 학생)
const noReserveLost = lost.sort((a,b)=>a-b).filter((lost) => !reserve.includes(lost));
// 여벌이 있고 체육복을 도난당하지 않은 학생(빌려줄 수 있는 학생)
let hasReserve = reserve.sort((a,b)=>a-b).filter((reverse) => !lost.includes(reverse));
const finalLost = noReserveLost.filter((lost) => {
// 첫번째로 체육복을 빌려줄 수 있는 사람
const lend = hasReserve.find((reserve) => Math.abs(reserve - lost) === 1);
// 체육복 빌려줄 사람이 없으면 그대로 lost 리턴
if(!lend) return lost;
// 빌려준 사람 제외하기
hasReserve = hasReserve.filter((reverse) => reverse !== lend);
})
// 답 = 전체 학생 수 - 체육복이 없는 학생 수
answer = n - finalLost.length;
return answer;
}
어떤 케이스에서 틀렸는지 알 수가 없어서 다른 분 풀이를 가져왔다.
내가 처음 썼던 풀이와 다른 점은 sort를 진행했다는 것과
filter를 통해 연산하지 않아도 되는 케이스를 제거했다는 것,
앞뒤 학생을 판별하는데 Math.abs로 한번에 처리했다는 점이다.