[JS] 체육복
function solution(n, lost, reserve) {
let realLost = lost.filter(l => !reserve.includes(l)).sort((a, b) => a - b);
let realReserve = reserve.filter(r => !lost.includes(r)).sort((a, b) => a - b);
let answer = n - realLost.length;
for(let i = 0; i < realLost.length; i++) {
let lostNum = realLost[i];
for(let j = 0; j < realReserve.length; j++) {
let reserveNum = realReserve[j];
if(reserveNum === lostNum - 1 || reserveNum === lostNum + 1) {
answer += 1;
realReserve[j] = -1;
break;
}
}
}
return answer;
}
let realLost = lost.filter(l => !reserve.includes(l)).sort((a, b) => a - b);
let realReserve = reserve.filter(r => !lost.includes(r)).sort((a, b) => a - b);
let answer = n - realLost.length;
체육복을 잃어버린 학생 중 동시에 여벌옷을 가지고 있는 학생을 제외합니다.
여벌옷을 가지고 있는 학생 중에서도 동시에 체육복을 잃어버린 학생을 제외합니다.
-> 자신의 여벌옷을 입으므로 빌려줄 수도 없습니다.
전체 학생 수 n에서 실제로 체육복을 잃어버린 학생 수(realLost.length)를 빼서, 기본적으로 체육 수업에 참여할 수 있는 학생 수를 계산합니다
for (let i = 0; i < realLost.length; i++) {
let lostNum = realLost[i];
for (let j = 0; j < realReserve.length; j++) {
let reserveNum = realReserve[j];
if (reserveNum === lostNum - 1 || reserveNum === lostNum + 1) {
answer += 1;
realReserve[j] = -1; // 이미 사용된 여벌 체육복 표시
break;
}
}
}
realLost 배열을 순회하여 각 잃어버린 학생(lostNum)에 대해,
realReserve 배열을 순회하면서 빌려줄 수 있는 여벌의 체육복을 가진 학생(reserveNum)을 찾습니다.
reserveNum === lostNum - 1 || reserveNum === lostNum + 1
여벌의 체육복을 가진 학생이 잃어버린 학생의 바로 앞번호이거나 뒷번호일 때 빌려줄 수 있습니다.
체육복을 빌려준 경우, answer를 1 증가시키고,
동일한 여벌의 체육복을 다른 학생에게 빌려주지 않도록
realReserve[j]를 -1로 설정하여 이미 빌려준 것으로 표시합니다.
break 문을 사용하여 한 번 빌려주면 다음 잃어버린 학생으로 넘어갑니다.
break
break 문은 반복문(루프)을 즉시 종료하는 명령어입니다.
반복문이 끝까지 실행되지 않고, 특정 조건이 만족되었을 때 반복문 중간에서 빠져나올 수 있습니다.
목적 달성 후 반복문 종료
반복문이 더 이상 실행될 필요가 없을 때 사용됩니다.
예를 들어, 체육복을 잃어버린 학생이 여벌의 체육복을 빌리게 되면,
그 학생에게 체육복을 빌려주는 과정을 더 이상 진행할 필요가 없습니다.
이 경우 break를 사용하여 해당 반복문을 종료하고, 다음 잃어버린 학생으로 넘어갑니다.
효율성
불필요한 반복을 피할 수 있습니다.
break가 없다면,
이미 체육복을 빌려줄 학생을찾은 후에도 계속해서 배열의 남은 부분을 검사하게 됩니다.
이는 불필요한 연산이므로 비효율적입니다.
break를 사용하면 필요한 경우에만 반복을 중단할 수 있어 효율성이 높아집니다.