https://programmers.co.kr/learn/courses/30/lessons/42862
전체 학생 수 : n
체육복을 도난당한 학생들의 번호가 담긴 배열 : lost
여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 : reserve
체육 수업을 들을 수 있는 학생의 최댓값 리턴
- 여벌 체육복을 가져온 학생이 체육복을 도난당한 경우는 다른 학생에게 체육복을 빌려줄 수 없음
1. 우선, 체육복을 여벌 가지고 있는데 도난 당한 학생 먼저 찾음
2. 이제 나머지 학생들 확인
function solution(n, lost, reserve) {
var answer = 0;
let mine = [];
for (let i = 1; i <= n; i++) {
if (lost.includes(i) && reserve.includes(i)) {
let idx = reserve.indexOf(i);
reserve.splice(idx, 1);
answer++;
mine.push(i);
}
}
for (let i = 1; i <= n; i++) {
if (lost.includes(i) && !mine.includes(i)) {
if (i - 1 > 0 && reserve.includes(i-1)) {
let idx = reserve.indexOf(i - 1);
reserve.splice(idx, 1);
answer++;
} else if (i + 1 <= n && reserve.includes(i + 1)) {
let idx = reserve.indexOf(i + 1);
reserve.splice(idx, 1);
answer++;
}
} else if(!mine.includes(i)) {
answer++;
}
}
return answer;
}
function solution(n, lost, reserve) {
const students = {}; // students라는 빈 객체 생성
let answer = 0;
for(let i = 1; i <= n; i++){
students[i] = 1; // students객체의 요소들 : i를 key값으로 하면서 값이 1
}
lost.forEach(number => students[number] -= 1);
// students객체에서 lost배열에 있는 학생에 해당하면 그 값을 -1해줌(즉 0이 되게)
reserve.forEach(number => students[number] += 1);
// 다시 students객체에서 reserve배열에 있는 학생들은 그 값을 +1해줌
// (여분이 있으면서 도난당하지 않아 체육복을 빌려줄 수 있는 학생은 2가 되고,
// 여분이 있었는데 도난당해 체육복을 자기가 입어야 하는 학생은 1이 됨)
for(let i = 1; i <= n; i++){
// 체육복이 2개인 학생들은 자기 앞 뒤에 학생들이 체육복이 0인지 보고 체육복이 없으면 자기 체육복을 빌려줌.
if(students[i] === 2 && students[i-1] === 0){
students[i-1]++;
students[i]--;
} else if(students[i] === 2 && students[i+1] === 0){
students[i+1]++;
students[i]--;
}
}
for(let key in students){
if(students[key] >= 1){
answer++;
}
}
// students객체에서 값이 1이상인 학생들의 수가 답!
// (1이상인 이유는 2도 있기 때문에.
// 체육복이 여벌 있었으나 이미 다들 빌렸거나 아니면 사이즈가 안 맞는 이유로 빌려줄 수 없어서 2개 그대로 가지고 있을수도 있기 때문)
return answer;
}
배운 점