📚 문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 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
'공부 > 프로그래머스' 카테고리의 다른 글
프로그래머스 레벨 1 x만큼 간격이 있는 n개의 숫자 자바스크립트 풀이 (0) | 2022.09.08 |
---|---|
프로그래머스 레벨 1 약수의 합 자바스크립트 풀이 (0) | 2022.09.04 |
프로그래머스 레벨 1 문자열을 정수로 바꾸기 자바스크립트 풀이 (0) | 2022.08.11 |
프로그래머스 레벨 1 소수 찾기 자바스크립트 풀이 (0) | 2022.08.09 |
프로그래머스 레벨 1 문자열 내림차순으로 배치하기 자바스크립트 풀이 (0) | 2022.08.07 |