❓문제 설명
- 최대 인원인 n: number, 체육복이 없는 인원의 명단인 lost: number[], 여분을 가지고 있는 명단 reserve: number[]
- 여분을 가지고 있는 학생은 자기 +-1 인원에게만 체육복을 빌려줄 수 있음
- 최대로 많이 수업을 들을 수 있는 인원의 수는?
✅ 문제 해결
- 먼저 가장 큰 예외 상황을 구별해야 한다. 그렇기에 도난당했는데 여분을 가지고 있는 학생을 제외하고 나머지에 대해서 공통적인 식을 대입을 해보자
let lost_student = lost.filter(v => !reserve.includes(v)).sort();
let reserve_student = reserve.filter(v => !lost.includes(v)).sort();
- 제외한 이후 정렬에 대해서 문제에 정의되어있지 않기에 좀 더 쉽게 해결하기 위해 정렬을 해준다.
for (let i = 0; i < reserve_student.length; i++) {
if (lost_student.includes(reserve_student[i] - 1)) {
lost_student = lost_student.filter(v => v !== reserve_student[i] - 1);
} else if (lost_student.includes(reserve_student[i] + 1)) {
lost_student = lost_student.filter(v => v !== reserve_student[i] + 1);
}
}
- 이후 반복문을 통해서 원하고자 하는 값을 추출한다
return n - lost_student.length;
- 마지막 결과에 대해 전체에서 참가하지 못하는 학생의 수를 빼준다.
🔥 인상 깊은 남의 풀이
function solution(n, lost, reserve) {
return n - lost.filter(a => {
const b = reserve.find(r => Math.abs(r-a) <= 1)
if(!b) return true
reserve = reserve.filter(r => r !== b)
}).length
}
❕느낀점
- 어떤 예외를 가장 먼저 처리해야할지에 대해서 좀 더 많은 고민이 필요하다 생각하다. 예외처리를 제대로 하지 않아서 좀 헤메었기에 다음부터는 좀 더 집중을 해야할 것 같다
- 절대값과 find 메서드를 통해서 구하는 풀이가 인상 깊어서 가져왔다. abs에 대해 생각하지 못한게 좀 아쉽고 find 메서드가 찾은 가장 첫번째 수에 대해서 return을 하기에 정렬된 lost라면 작은 수부터 처리를 할 수 있어서 매우 적합하다고 생각이 된다.
- 쉬운 문제지만 아직 제대로 감을 못잡았나 속도가 잘 안나고 헷갈리는 부분이 많은 것 같다.