본문 바로가기
Study Note/Algorithm

프로그래머스 #탐욕법(Greedy) - 체육복 lv1

by 시뮝 2021. 9. 12.
728x90

풀이

 

문제

function solution(n, lost, reserve) {
    let answer = 0;
    let result = [];
    
    // 여벌이 있는 학생이 도난당한 경우 lost 와 reserve 에서 제외합니다.
    let isNotReserve = reserve.filter((re) => lost.find((lo) => re === lo));
    lost = lost.filter((re) => !isNotReserve.find((notReserve) => re === notReserve));
    reserve = reserve.filter((re) => !isNotReserve.find((notReserve) => re === notReserve));
    
    for (let i=1; i<=n; i++) {
        const isLost = lost.find((lo) => lo === i);
        if(isLost) {
            // i번 학생이 체육복을 잃어버린 경우 빌릴 수 있는지 체크하여 담습니다.
            const canIndex = canBeBorrow(i, reserve);
            if(canIndex !== -1) {
                // 빌려줬으니 배열에서 뺍니다.
                reserve.splice(canIndex, 1);
                result.push(i);
            }
        } else {
            // 잃어버린 학생이 없으므로 1명 추가합니다.
            result.push(i);
        }
    }
    return result.length;
}

function canBeBorrow(lost, reserve) {
    let result = -1;
    
    const before = reserve.findIndex((re) => re === lost - 1);
    if(before !== -1) {
        result = before;
    } 
    
    const after = reserve.findIndex((re) => re === lost + 1);
    if(result === -1 && after !== -1) {
        result = after;
    }
    
    return result;
}

 

채점결과

728x90

댓글