Problem
Solve
내 풀이
const getIndexToDelete = (student, lost) => {
const prev = lost.indexOf(student - 1);
if (prev !== -1) return prev;
const next = lost.indexOf(student + 1);
if (next !== -1) return next;
return null;
};
const solution = (n, lost, reserve) => {
const l = lost.filter(student =>{
return reserve.indexOf(student) === -1;
})
const r = reserve.filter(student => {
return lost.indexOf(student) === -1
});
r.forEach(student => {
const flag = getIndexToDelete(student, l);
if (flag !== null) l.splice(flag, 1);
});
const answer = n - l.length;
return answer;
};
다른 사람 풀이Array.apply(undefined, new Array(n))
function solution(n, lost, reserve) {
const actualReserve = reserve.filter(el => lost.indexOf(el) === -1);
const actualLost = lost.filter(el => reserve.indexOf(el) === -1);
const set = Array.apply(undefined, new Array(n)).map((el, i) =>
actualLost.indexOf(i + 1) === -1 ? true : false
);
for (let hero of actualReserve) {
if (set[hero - 1 - 1] === false) {
set[hero - 1 - 1] = true;
} else if (set[hero - 1 + 1] === false) {
set[hero - 1 + 1] = true;
}
}
console.log(actualReserve, set, set.filter(el => el).length);
return set.filter(el => el).length;
}
다른 사람 풀이 (반례에 실패함)
// 정답은 6인데, 7이 나온다. 반례에 실패하는 풀이이다.
solution(7, [2, 3, 4], [1, 2, 3, 6]);
function solution(n, lost, reserve) {
const answer =
n -
lost.filter(a => {
const b = reserve.find(r => Math.abs(r - a) <= 1);
if (!b) return true;
reserve = reserve.filter(r => r !== b);
}).length;
return answer;
}
What I learned
절대값 사용
+1 or -1 or ===
를 절대값 함수를 통해 표현할 수 있다. 절대값이 1과 같거나, 작다고 표현된다.
reserve.find(r => Math.abs(r - a) <= 1);
반례
알고리즘 풀 때 지문 상에서 주어지는 한계에 대해 유심히 살핀다. 이번 지문에서는 "여벌 체육복을 가져온 학생이 체육복을 도난당 했을 수 있다" 는 내용이 반례다.
이 반례를 포함하려면 처음 시작할 때 lost, reserve
배열에 같은 숫자를 서로 제거하는 로직이 필요하다.
const l = lost.filter(student =>{
return reserve.indexOf(student) === -1;
})
const r = reserve.filter(student => {
return lost.indexOf(student) === -1
});
Array.find(callback)
배열에서 callback 함수의 return 이 true 가 나오는 첫번째 값을 반환한다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find