🔎 문제
🧩 구현과정 및 코드
개인 토글 영역에 구현 과정과 코드를 자유롭게 작성해주시면 됩니다.
사용할 데이터 구조와 풀이 방향성
적용할 알고리즘 혹은 메서드
수영
구현
- 그리디
- 첫 구현: 하나의 배열에 선언 → lost, reserve 같은 학생 예외 처리X
코드
function solution(n, lost, reserve) { // 처음에 수업 들을 수 있는 학생 let answer = n - lost.length; // lost, reserve에 같은 학생이 있다면 배열에서 제외 const lostStudents = lost.sort((a, b) => a - b).filter(l => !reserve.includes(l)) let reserveStudents = reserve.sort((a, b) => a - b).filter(r => !lost.includes(r)) // lost + reserve 수업을 들을 수 있는 학생 answer += lost.length - lostStudents.length; lostStudents.sort((a, b) => a - b) lostStudents.forEach(l => { // 여벌 있는 친구가 없으면 pass if(reserveStudents.length === 0) return; // 여벌을 빌려줄 수 있는 친구가 있다면 if(reserveStudents.includes(l-1)) { reserveStudents = reserveStudents.filter(r => r !== l-1) answer++ } else if(reserveStudents.includes(l+1)) { reserveStudents = reserveStudents.filter(r => r !== l+1) answer++ } }) return answer; }
정은
구현
코드
function solution(n, lost, reserve) { var answer = n-lost.length; lost.sort((a,b)=>a-b); reserve.sort((a,b)=>a-b); for (const l of lost) { for (const r of reserve) { if (l==r) { answer++; lost = reserve.filter(lo => lo !== l); reserve = reserve.filter(re => re !== r); } } } for(const lostStd of lost) { const avail1=lostStd-1, avail2=lostStd+1; if (reserve.includes(avail1)) { reserve = reserve.filter(re=> re !== avail1); answer++; } else if (reserve.includes(avail2)) { reserve = reserve.filter(re=> re !== avail2); answer++; } } return answer; }
종혁
구현
- 완전탐색에 가까운 그리디
코드
function solution(n, lost, reserve) { let newLost = [...lost] newLost.forEach((lostStudents,i) => { if(reserve.includes(lostStudents)){ lost.splice(lost.indexOf(lostStudents),1) reserve.splice(reserve.indexOf(lostStudents),1) } })//여벌의 체육복을 가지고 있는 학생이 체육복을 잃어버렸을 경우 - 본인은 들을 수 있지만 다른사람에게 빌려줄 순 없으니 lost , reserve에서 제거 lost = lost.sort((a,b) => a- b) reserve = reserve.sort((a,b) => a- b) let lostNumber = lost.length lost.forEach((student,index) => {//lost 학생들 중에서 순차적으로 빌릴 수 있는 사람이 있는지를 조사 if(lostNumber){ if (reserve.includes(student - 1)){ lostNumber -= 1 reserve.splice(reserve.indexOf(student-1),1) return } if (reserve.includes(student + 1)){ lostNumber -= 1 reserve.splice(reserve.indexOf(student+1),1) return }} } ) return n - lostNumber }
재웅
구현
- 유효한 Return을 찾는 방향으로 접근하였음
- (여분)에도 없고, (분실)에도 없으면 체육복을 가져온 것 -> 그 수만큼 return++
- (여분)에도 있고, (분실)에도 있으면, 그 학생은 빌려줄 수 없음 -> 그 학생만 return++
- n개 배열에서 관리, 값은 옷의 개수임
코드
function solution(n, lost, reserve) { let answer = 0; let arr = new Array(n+1).fill(1) arr[0] = NaN lost.forEach(el=>arr[el]--) reserve.forEach(el=>arr[el]++) arr.forEach((el,idx)=>{ const leftIdx = idx-1 const rightIdx = idx+1 if(el===2 && arr[leftIdx]===0){ arr[leftIdx]++ arr[idx]-- }else if(el===2 && arr[rightIdx]===0){ arr[rightIdx]++ arr[idx]-- } }) return arr.filter(el=>el>=1).length; }
✏️ 후기
문제를 풀고 느낀 점, 막혔던 부분 혹은 개선 사항 등을 자유롭게 작성해주시면 됩니다.
수영
- filter 활용을 이렇게 할 수 있구나 공부할 수 있는 예제였다.
정은
종혁
- 특정 알고리즘을 적용하기 전에 일단 완전탐색이 가능한지를 조사해보는 게 좋을 것 같다
재웅