문제 : https://programmers.co.kr/learn/courses/30/lessons/42862
function solution(n, lost, reserve) {
let cnt = 0;
// 1.lost,reserve에 없는 애는 cnt1
for (let i = 1; i <= n; i += 1) {
if (![...lost, ...reserve].includes(i)) {
cnt += 1;
}
}
// 2.lost,reserve 에서 중복되는 애는 cnt1 하고, 각각의 배열에서 제거하기
for (const el of lost) {
if (reserve.includes(el)) {
cnt += 1;
lost = lost.filter((d) => d !== el);
reserve = reserve.filter((d) => d !== el);
}
}
// 3.reserve숫자 앞뒤에 lost 있는지 ? 있으면 cnt2, 해당숫자 제거
for (const el of reserve) {
if (lost.includes(el - 1)) {
cnt += 2;
lost = lost.filter((d) => d !== el - 1);
reserve = reserve.filter((d) => d !== el);
} else if (lost.includes(el + 1)) {
cnt += 2;
lost = lost.filter((d) => d !== el + 1);
reserve = reserve.filter((d) => d !== el);
} else {
// 4.reserve에만 남아있는 숫자는 cnt+
cnt += 1;
}
}
return cnt;
}
🔶다른 사람이 푼 방법
방법1.
function solution(n, lost, reserve) {
const students = {}; // {1:1 , 2:1 , 3:1 , 4:1 , 5:1}
let answer = 0; //
// 1.처음엔 모든 학생들이 체육복1개씩 있음.
for (let i = 1; i <= n; i += 1) {
students[i] = 1;
}
// 2.잃어버린 사람은 -1씩 , 여분 있는 사람은 +1씩
lost.forEach((number) => (students[number] -= 1));
reserve.forEach((number) => (students[number] += 1));
// 3.여분 있는 학생의 앞뒤를 검색해서, 옷 빌려줌.
for (let i = 1; i <= n; i += 1) {
if (students[i] === 2 && students[i - 1] === 0) {
students[i - 1] += 1;
students[i] -= 1;
} else if (students[i] === 2 && students[i + 1] === 0) {
students[i + 1] += 1;
students[i] -= 1;
}
}
// 4.students객체를 돌면서 체육복 갖고있는 학생 수 가운트함.
for (const key in students) {
if (students[key] >= 1) {
answer += 1;
}
}
return answer;
}
방법2 -찐으로 lost인 애만 전체에서 빼는 방식 (18번 오류남)
function solution(n, lost, reserve) {
const realReserve = reserve.filter((r) => !lost.includes(r));
const realLost = lost.filter((r) => !reserve.includes(r));
const ableNum = realLost.filter((a) => {
return realReserve.find((b, i) => {
const has = b === a - 1 || b === a + 1;
if (has) {
delete realReserve[i];
}
return has;
});
}).length;
// 전체 - 체육복 못빌린 애
return n - (realLost.length - ableNum);
}