본문 바로가기

알고리즘 문제풀이

[프로그래머스] 고득점 키트 - 그리디1

오늘 푼 문제

 

1. 체육복 / Lv.1 / 시간 : 21분

programmers.co.kr/learn/courses/30/lessons/42862?language=javascript

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

function solution(n, lost, reserve) {
    var answer = 0;
    
    const reserveObj = reserve.reduce((acc,cur)=>{
        if(lost.includes(cur)) lost.splice(lost.indexOf(cur),1);
        else acc[cur] = 1;
        return acc;
    },{});
    
    let nLost = lost.length;

    lost.forEach(n=>{
        if(reserveObj[n-1]){
            reserveObj[n-1] --;
            nLost--;
        }else if(reserveObj[n+1]){
            reserveObj[n+1] --;
            nLost--;
        }
    });
    
    answer = n - nLost;
    
    return answer;
}

 

헤맸던 부분 

문제 조건 중 다음과 같은 부분이 있다.

여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

따라서 여벌 체육복을 가져온 애가 잃어버린 경우를 먼저 고려해서 대여 가능 한 목록에서 빼줘야 한다. 안 그러면 앞 번호가 스틸해 갈 수 있음.