
Greedy 알고리즘에 대한 설명은 다음을 참조하길 바란다
문제로 넘어가자

function solution(n, lost, reserve) {
// 일단 잃어버린 사람 수 만큼 빼준 것이 최소 답안
let answer = n - lost.length;
lost = lost.filter((number) => {
if (reserve.indexOf(number) === -1) {
return number;
} // 여벌 체육복을 가져온 학생이 체육복을 도난당한 경우
// 빌려줄 수 없으므로 삭제하고 최종답안 1증가
else {
reserve.splice(reserve.indexOf(number), 1);
answer += 1;
}
});
// 오름 차순으로 정렬
lost = lost.sort((a, b) => b - a);
reserve = reserve.sort((a, b) => b - a)
for (let i = 0; i < reserve.length; i++) {
// 바로 뒷번호 학생이나 앞번호 학생에게 빌려줄 수 있으면
// 답 1 증가 시키고, lost에서 해당 학생 삭제
if (lost.indexOf(reserve[i] + 1) != -1) {
answer += 1;
lost.splice(lost.indexOf(reserve[i] + 1), 1);
}
else if (lost.indexOf(reserve[i] - 1) != -1) {
answer += 1;
lost.splice(lost.indexOf(reserve[i] - 1), 1);
}
}
return answer;
}