[Programmers] 체육복
문제 이해
체육복이 있어야만 체육 수업을 들을 수 있다. 체육복을 도난당한 학생들이 있고, 여벌의 체육복을 보유한 학생들이 있다. 여벌 체육복을 가진 학생은 바로 앞번호나 바로 뒷번호 학생에게 체육복을 빌려준다. 최대한 많은 학생이 체육 수업을 들을 수 있게 빌려준다면, 최대 몇명이 수업을 들을 수 있는지 구해야 한다.
접근 방법
제한 사항에서 여벌 체육복을 가진 학생도 도난 당한 학생일 수도 있다고 했기 때문에 그 여부먼저 파악을 하고, 진짜 도난 당한 학생 배열을 만들어 주고 앞, 뒤 번호 학생이 도난 당했는지 판별 후 빌려준 뒤, 전체 학생 수에서 도난 당한 학생 수를 빼면 체육복을 가진 총 학생수가 나올 것이라고 생각.
풀이
체육복을 가진 학생이 도난 당한 학생인지 판별, 앞, 뒤 번호 학생이 도난 당한 학생인지 판별하기 위해 각자 for of 반복문을 돌려주고, 마지막에 총 학생 수에서 도난당한 학생 수를 뺐다.
function solution(n, lost, reserve) {
let lostStd = [];
reserve.sort();
for (let el of lost) {
if (reserve.includes(el)) {
// 여벌의 체육복을 가진 학생이 도난당한 학생인지
let rmIdx = reserve.indexOf(el);
reserve.splice(rmIdx, 1); // 맞다면 여벌의 체육복을 가진 학생 배열에서 빼준다.
} else {
lostStd.push(el); // 그게 아니라면 진짜 도난당한 학생 배열에 넣어준다.
}
}
for (let el of reserve) {
if (lostStd.includes(el - 1)) {
// 잃어버린 학생이 앞번호 학생이라면
let rmLost = lostStd.indexOf(el - 1);
lostStd.splice(rmLost, 1); // 체육복을 빌려준다 (잃어버린 학생에서 삭제)
} else if (lostStd.includes(el + 1)) {
// 잃어버린 학생이 뒷번호 학생이라면
let rmLost = lostStd.indexOf(el + 1);
lostStd.splice(rmLost, 1); // 체육복을 빌려준다 (잃어버린 학생에서 삭제)
}
}
return n - lostStd.length; // 전체 학생 수에서 남은 잃어버린 학생 수를 빼준다.
}