프로그래머스 Lv.1 체육복

Kim Jason·2023년 4월 3일
0

알고리즘 노트

목록 보기
18/35
post-thumbnail

💁🏻 코드

function solution(n, lost, reserve) {
    const students = new Set(Array(n).fill(0).map((_, idx) => idx + 1));
    // ✅ 정렬해야 최대한의 학생이 체육 수업을 들을 수 있게 된다
    // ✅ 반례) reserveSet = [4, 2] & losetSet = [3, 5]
    const lostSet = new Set(lost.sort((a, b) => a - b));
    const reserveSet = new Set(reserve.sort((a, b) => a - b));
    
    // ✅ 체육복을 잃어버렸지만 여분을 갖고 있는 경우에는 빌려주기 전에 자급자족해야 한다
    lost.forEach(el => {
        if (reserveSet.has(el)) {
            reserveSet.delete(el);
            lostSet.delete(el);
        }
    })
    
    lost.forEach(el => {
        if (reserveSet.has(el - 1)) {
            reserveSet.delete(el - 1);
            lostSet.delete(el);
        } else if (reserveSet.has(el + 1)) {
            reserveSet.delete(el + 1);
            lostSet.delete(el);
        }
    })
    
    return n - [...lostSet].length;
}

입력값의 제한은 다음과 같다.

  • 2 <= 전체 학생의 수 n <= 30

어떤 알고리즘을 써도 무방하다고 생각했다.
이 문제에서 핵심은 체육복을 잃어버린 학생들의 번호가 담긴 배열과 여분의 체육복을 갖고 있는 학생들의 번호가 담긴 배열을 정렬해야 한다는 사실이다.

profile
성장지향형 프론트엔드 개발자

0개의 댓글