6주차 화요일 알고리즘

체육복

function solution(n, lost, reserve) {
let result=[]
const max=(lost.length,reserve.length)
for(let i=0;i<max;i++){
result+=lost.filter((el)=> el=== reserve[i]+1 ||el=== reserve[i]-1)
}

if(lost.length > result.length){
return n+result.length-lost.length
}else{return n-lost.length+reserve.length > n ? n : n-lost.length+reserve.length}

}

멘토님풀이

function solution(n, lost, reserve) {
const losted=[...lost]//lost가 필터되기 이전의 테이터를 저장한다.
lost =lost.filter(student=>!reserve.includes(student)).sort((a,b)=>a-b)
reserve=reserve.filter(student=> !losted.includes(student)).sort((a,b)=>a-b)

let answer = n-lost.length;

for(let i=0;i<lost.length;i++){
// 내 앞번호의 학생이 여벌체육복을 가지고 있는지를 검사
if(reserve.includes(lost[i]-1)){
reserve.splice(reserve.indexOf(lost[i]-1),1)
answer++
// 내 뒷번호의 학생이 여벌 체육복을 가지고 있는지를 검사
}else if(reserve.includes(lost[i]+1)){
reserve.splice(reserve.indexOf(lost[i]+1),1)
answer++
}
}

return answer

}
solution( 5, [2, 4], [3])

앞뒤 학생만 비교하는게아니라
제한사항이었던 중복데이터 처리와
번호릐 뒤죽박죽일 가능성을 염두해야했돠...

다른방법

function solution(n, lost, reserve) {
const losted=[...lost]//lost가 필터되기 이전의 테이터를 저장한다.
lost =lost.filter(student=>!reserve.includes(student)).sort((a,b)=>a-b)
reserve=reserve.filter(student=> !losted.includes(student)).sort((a,b)=>a-b)

let answer = n-lost.length;
return lost.reduce((acc,cur)=>{
// 앞에있는 학색이 여벌 에츅복을 가지고 있는지
const prev=reserve.indexOf(cur-1)
// 뒤에있는 학생이 여벌 체육복을 가지고 있는지
const next=reserve.indexOf(cur+1)
// 앞에있는학생이 여벌체육복을 가지고 있는 경우
if(prev!==-1){
reserve.splice(prev,1)
acc++
}else if(next !== -1){
// 뒤에있는학생이 여벌체육복을 가지고 있는 경우
reserve.splice(next,1)
acc++
}

return acc;

},answer)

}

좋은 웹페이지 즐겨찾기