공부/프로그래머스

프로그래머스 레벨 1 체육복 자바스크립트 풀이

두둥탁! 2022. 8. 13. 23:56
반응형

📚 문제 설명

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.


📚 제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

📚 입출력 예

n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

📚 입출력 예 설명

예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.

예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.


📚 풀이

function solution(n, lost, reserve) {
    let lost2 = lost.filter((lostElement) => {		// lost 배열과 reserve 배열의 중복값 제거 후 다른 배열에 저장
        return !reserve.includes(lostElement);
    });
    let reserve2 = reserve.filter((r) => {
        return !lost.includes(r);
    });
    let answer = n - lost2.length;		// 현재 체육복을 입을 수 있는 사람의 수 

    lost2.sort((a, b) => {		// lost2 배열과 reserve2 배열 오름차순 정렬
        return a - b;
    });
    reserve2.sort((a, b) => {
        return a - b;
    });

    for (let i of reserve2) {		// reserve2 배열에서 처음부터 하나씩 뽑음
        if (lost2.includes(i - 1)) {		// lost2 배열에 위 배열에서 뽑은 숫자인 i에서 1을 뺀 수가 있으면
            lost2 = lost2.filter((lostElement) => {		// i에서 1을 뺀 수를 제외한 수만 남김(i-1과 같은 수는 삭제)
                return lostElement !== i - 1;
            });
            answer++;		// 체육복을 입을 수 있는 사람의 수 1 증가
        } else if (lost2.includes(i + 1)) {		// lost2 배열에 위 배열에서 뽑은 숫자인 i에서 1을 더한 수가 있으면
            lost2 = lost2.filter((lostElement) => {		// i에서 1을 더한 수를 제외한 수만 남김(i-1과 같은 수는 삭제)
                return lostElement !== i + 1;
            });
            answer++;		// 체육복을 입을 수 있는 사람의 수 1 증가
        }
    }

    return answer;
}

오름차순 정렬을 왜 해줘야 하는 건지 이해가 안 갔었는데 사람들이 알려준 반례를 보고 이해가 갔다.

 

n = 5
lost = [2,4]
reserve = [3,1]
result = 5

 

위의 풀이를 기준으로 이런 테스트 케이스를 넣으면 reserve 배열의 첫 번째 수인 3이 먼저 for문에서 실행되고 lost 배열의 2가 없어지면서 answer이 4가 되는데 두 번째 수인 1을 넣을 때에는 lost 배열의 2가 없어지고 4만 남아서 빌려줄 수 있는 체육복이 없다. 바로 앞 또는 뒷 번호만 빌려주기 때문에..

 

그리고 여벌 옷의 체육복을 가져온 학생이 도난을 당했을 경우는 남은 체육복이 하나이기 때문에 다른 학생에게 빌려줄 수 없다는 제한사항은 그냥 여벌 옷 없이 자기가 가져온 옷을 입는다는 것과 같은 말이기 때문에 lost 배열과 reserve 배열에서 둘 다 제거하였다.


📚 출처

https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=javascript# 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형