체육복
answer += n-lost.length;
for(let i=0; i<lost.length; i++){
let isDuple = reserve.indexOf(lost[i]);
if(isDuple !== -1) {
reserve.splice(isDuple, 1);
lost.splice(i, 1);
i--;
answer++;
}
}
lost.sort((a,b) => {
return a > b ? 1 : -1;
});
reserve.sort((a,b) => {
return a > b ? 1 : -1;
});
for(let i=1;i<=n;i++) { ... }
4-1. 내부 로직에서 첫번째로 만약 reserve의 첫번째 값이 순회하는 학생 번호보다 2이상 차이나면 대여를 해줄 수 없으니 shift() 를 반복하여 빼주기로 했다.
while(i-2>=reserve[0]) {
reserve.shift();
}
4-2. 순회하는 도중 학생의 번호가 lost 배열에 담겨있는 경우 reserve의 첫번째 값이 학생 번호보다 1이 작거나 1이 크면 대여가능하도록 하고, 체육복이 있는 학생의 수(answer)를 증가시켜주었다. 마지막으로는 대여를 해주었으므로 reserve 첫번째 값을 shift() 해주었다.
const isLostStudent = lost.includes(i);
if (isLostStudent) {
if(reserve[0] === i-1 || reserve[0] === i+1) {
answer++;
reserve.shift();
}
}
function solution(n, lost, reserve) {
var answer = 0;
answer += n-lost.length;
for(let i=0; i<lost.length; i++){
let isDuple = reserve.indexOf(lost[i]);
if(isDuple !== -1) {
reserve.splice(isDuple, 1);
lost.splice(i, 1);
i--;
answer++;
}
}
lost.sort((a,b) => {
return a > b ? 1 : -1;
});
reserve.sort((a,b) => {
return a > b ? 1 : -1;
});
for(let i=1;i<=n;i++) {
while(i-2>=reserve[0]) {
reserve.shift();
}
const isLostStudent = lost.includes(i);
if (isLostStudent) {
if(reserve[0] === i-1 || reserve[0] === i+1) {
answer++;
reserve.shift();
}
}
}
return answer;
}
function solution(n, lost, reserve) {
const students = {};
let answer = 0;
for(let i = 1; i <= n; i++){
students[i] = 1;
}
lost.forEach(number => students[number] -= 1);
reserve.forEach(number => students[number] += 1);
for(let i = 1; i <= n; i++){
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++;
}
}
return answer;
}
객체의 key:value
형태를 응용해서 학생의 번호가 1~n까지 순차적이란 점을 고려해 객체를 활용한 풀이라고 생각한다.
가독성도 좋고 lost와 reserve에 대해 학생이 가진 체육복을 연산해줄 때, key에 직접 접근하여 증감시켜주는 부분이 특히 좋았다..