
function solution(n, lost, reserve) {
var answer = n;
//정렬먼저
let lostArr=lost.sort((a,b)=>{return a-b;}).slice();
let reserveArr=reserve.sort((a,b)=>{return a-b;}).slice();
// 1-3의 차례로 고려를 해야만 문제를 바르게 풀 수 있음 -> greedy 알고리즘 : local로 보았을 때 더 합리적인 선택을 선택한다.
// 1. 잃어버렸지만 여분 있는 놈일때 **"먼저"** 고려
for(let i=0; i<lost.length ; i++){
if(reserveArr.includes(lost[i])){
reserveArr.splice(reserveArr.indexOf(lost[i]),1);
lostArr.splice(lostArr.indexOf(lost[i]),1);
// 문제풀때 아래와 같은 "실수" 여러번 반복함. 반복문 돌리고 있는 배열이 제거, 추가 등으로 바뀌면 반복문 돌리는 순서에 영향이 간다*** 따라서 따로 새로운 배열을 만들든가해서 이러한 오류를 방지해야함.
// lost.splice(i,1);
}
}
// lost한 학생 바뀐거 다시 배열만들어줘
let lostSave=lostArr.slice();
for(let i=0; i<lostSave.length ; i++){
// 2. 여분있는 놈보다 앞번호가 잃어버린걸 "우선"적으로 고려
if(lostSave[i]-1>0 && reserveArr.includes(lostSave[i]-1)){
reserveArr.splice(reserveArr.indexOf(lostSave[i]-1),1);
lostArr.splice(lostArr.indexOf(lostSave[i]),1);
}
// 3. 그 다음으로 여분 있는 놈보다 뒷번호가 잃어버린걸 고려한다.
else if(lostSave[i]+1<=n && reserveArr.includes(lostSave[i]+1)){
reserveArr.splice(reserveArr.indexOf(lostSave[i]+1),1);
lostArr.splice(lostArr.indexOf(lostSave[i]),1);
}
}
answer=answer-lostArr.length;
return answer;
}
// 참고할만한 풀이
// function solution(n, lost, reserve) {
// lost.sort((a,b)=>a-b);
// reserve.sort((a,b)=>a-b);
// const newLost = lost.filter(l=> !reserve.includes(l) );
// let newReserve = reserve.filter(r=> !lost.includes(r) );
// return n - newLost.filter(a => {
// const b = newReserve.find(r => Math.abs(r-a) <= 1)
// if(!b) return true
// newReserve = newReserve.filter(r => r !== b) }).length;
// }
// 참고할만한 풀이
// function solution(n, lost, reserve) {
// const students = {};
// let answer = 0;
// for(let i = 1; i <= n; i++){
// students[i] = 1;
// }
// lost.forEach(number => students[number] -= 1);
// reserve.forEach(number => students[number] += 1);
// for(let i = 1; i <= n; i++){
// if(students[i] === 2 && students[i-1] === 0){
// students[i-1]++;
// students[i]--;
// } else if(students[i] === 2 && students[i+1] === 0){
// students[i+1]++;
// students[i]--;
// }
// }
// for(let key in students){
// if(students[key] >= 1){
// answer++;
// }
// }
// return answer;
// }