
arr를 만든 뒤 전부 1로 초기화 한다. 해당 배열에 인덱스는 "학생 번호-1" 을 의미하며 값으로는 체육복의 개수를 갖는다.lost와 reserve를 arr에 반영해주면 arr 배열에 체육복이 없는 학생은 0, 하나만 있는 학생은 1, 여벌까지 있는 학생은 2라는 값을 갖게 될 것이다.처음엔 아래 처럼 코드를 작성했더니 83.3/100점이 나와서 무엇이 문제인지 생각해봤다.
function solution(n, lost, reserve) {
// 각 학생별 체육복 수량 초기화
const arr = Array(n).fill(1);
lost.forEach(e=> arr[e-1] -= 1);
reserve.forEach(e=>arr[e-1] += 1);
// 현재 학생이 채육복이 없다면 뒤,앞 여벌 남는 학생에게 하나 빌리기.
arr.forEach((e,i)=>{
if(arr[i] === 0 && arr[i+1] === 2){
arr[i] += 1;
arr[i+1] -= 1;
}
if(arr[i] === 0 && arr[i-1] === 2) {
arr[i] += 1;
arr[i-1] -=1;
}
})
return arr.filter(e=>e > 0).length;
}
위 코드는 arr.forEach 문에서 만약 현재 학생이 체육복이 없다면(0이라면) 뒤에 있는 학생(i+1)에게 먼저 빌릴수 있나 확인해보고 그 다음 앞에 있는 학생(i-1)에게 빌릴 수 있나 확인을 한다.
하지만 뒤에 있는 학생과 먼저 비교하면 테스트 케이스가 n=4, lost=[2,4], reserve=[1,3] 일 때 문제가 발생한다.
const arr = Array(n).fill(1);
lost.forEach(e=> arr[e-1] -= 1);
reserve.forEach(e=>arr[e-1] += 1);
n=4, lost=[2,4], reserve=[1,3] 일 때, 결괏값은 4가 나와야 정상이다.
하지만 위 코드가 수행되고 난 뒤에 arr에는 [2,0,2,0]이 저장되고 arr.forEach문까지 수행된 뒤에는 arr = [2,1,1,0] 이 되므로 결괏값은 3이 출력된다.
따라서 현재 학생이 체육복이 없을 경우 앞에 있는 학생에게 먼저 빌릴수 있나 확인하도록 바꾸었다.
function solution(n, lost, reserve) {
// 각 학생별 체육복 수량 초기화
const arr = Array(n).fill(1);
lost.forEach((e) => (arr[e - 1] -= 1));
reserve.forEach((e) => (arr[e - 1] += 1));
// 현재 학생이 채육복이 없다면 앞,뒤 여벌 남는 학생에게 하나 빌리기.
arr.forEach((e, i) => {
if (arr[i] === 0 && arr[i - 1] === 2) { // 바뀐 부분
arr[i] += 1;
arr[i - 1] -= 1;
}
if (arr[i] === 0 && arr[i + 1] === 2) { // 바뀐 부분
arr[i] += 1;
arr[i + 1] -= 1;
}
});
return arr.filter((e) => e > 0).length;
}