프로그래머스 문제 링크
My Solution / Try
- 학생수 길이의 배열을 만들고 전부 1로 채움 (Array,fill 활용)
- 잃어버린 학생의 배열의 요소는 0으로 재할당
- 여벌을 가지고 있는 학생의 배열의 요소는 +1
- 반복문을 돌며 잃어버린 학생(i)의 앞번호 학생(i-1)이 여벌을 가지고 있다면
해당 학생에게 빌려주고(arr[i] = 1) 앞번호 학생의 체육복 개수는 다시 1개로(arr[i-1] = 1)
앞번호 학생이 여벌을 가지고 있다면
arr[i] = 1 / arr[i+1] = 1
function solution(n, lost, reserve) {
let arr = Array(n).fill(1);
lost.map((e) => arr[e-1] = 0);
reserve.map(e => arr[e-1] += 1);
for(let i=0; i<n; i++){
if(arr[i] === 0 && arr[i-1] ===2){
arr[i] = 1;
arr[i-1] = 1;
}
else if(arr[i] === 0 && arr[i+1] === 2){
arr[i] = 1;
arr[i+1]=1;
}
}
return arr.filter(e => e > 0).length;
}
Another Solution
- 체육복을 도난 당하고 여벌도 없는 학생(lost_student)
- 체육복을 도난 당했지만 여벌이 있는 학생 / 체육복을 도난 당하지 않고 여벌도 있는 학생(reverse_student) 구분 필요
function solution(n, lost, reserve) {
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;
}