[프로그래머스] Greedy_체육복

Junseok Lee·2023년 3월 21일
0

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;
// }
profile
새로시작하는 코맹이입니다

0개의 댓글