[프로그래머스 | Javascript] 체육복

박기영·2022년 9월 12일
0

프로그래머스

목록 보기
6/159
post-custom-banner

프로그래머스. 코딩테스트 고득점 Kit.
탐욕법(Greedy). 1단계

solution

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로 한번에 처리했다는 점이다.

참고 자료

참고 자료 1

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글