학생의 수n / 체육복을 잃어버린 학생 목록 lost / 여벌의 체육복을 가지고있는 학생목록 reserve 가 인자로 들어온다.
여벌의 체육복을 가진 학생의 번호 양옆으로만 체육복을 빌려줄 수 있다.
체육복을 가진 학생만 체육수업을 들을 수 있다고 할 때, 가능한 최대의 수는 얼마인지 리턴하는 문제이다.
먼저 작성한 코드
function solution(n, lost, reserve) {
var answer = n;
lost.sort((a,b) => a-b)
reserve.sort((a,b) => a-b)
let realLost = lost.filter((x) => !reserve.includes(x))
let realReserve = reserve.filter((x) => !lost.includes(x))
for (let i = 0; i<realLost.length; i++) {
if (!realReserve.includes(realLost[i]-1) && !realReserve.includes(realLost[i]+1)) {
answer--
continue;
}
if (realReserve.includes(realLost[i]-1)) {
let target = realReserve.indexOf(realLost[i]-1)
realReserve.splice(target, 1)
continue;
}
if (realReserve.includes(realLost[i]+1)) {
let target = realReserve.indexOf(realLost[i]+1)
realReserve.splice(target, 1)
continue;
}
}
return answer;
}
가장먼저 lost, reserve 두 배열을 오름차순으로 정렬해준다.
잃어버렸지만 여벌의 체육복을 가진 상황이 있을 수 있으므로 filter을 돌려 상대 배열에 포함되지 않은 것만 모아
realLost와 realReserve 배열 두개를 만들어준다.
반복문을 실행하는데, realLost[i]-1(잃어버린 학생 앞번호)와 realLost[i]+1(잃어버린 학생 뒷번호)가 모두 realReserve 배열에 포함되지 않은 경우에 n으로 설정해둔 answer에서 1을 빼고 다음 반복문을 실행한다.
만약 realReserve가 잃어버린 학생의 앞번호를 포함하고있다면, 해당 번호의 인덱스값을 찾고 realReserve에서 해당 번호를 빼고 다음 반복문을 실행한다. 뒷번호 또한 같은 방식으로 작동한다.
반복문이 끝나면 answer을 리턴한다.
문제를 풀며 좀 이해가 가지 않았다.
예외처리에도 적절한 예외가 있어야하는데, 잃어버렸지만 여벌을 가진 학생을 도대체 어떻게 생각할 수 있을까
억지스러운 면도 있지만, flter메서드를 활용하여 처리가능하다.