정렬은 이미 간파했고, 생각보다 쉬웠다고 생각했는데 생각보다 당황스러운 예외 케이스가 있던 문제였어요.
아무래도 이 글을 보고 계신 분들께서는 예외처리를 한 번 더 고민하시고 보시면 될 거 같습니다 😘 충분히 풀 수 있을 거에요!
그럼에도 잘 모르겠다! 싶으면 다음 풀이과정에서 발생하는 예외케이스들을 고민해보시면 될 듯 합니다.
먼저 다음을 고민해야 해요.
어떻게 최대 참여자 수를 보장할 수 있는가?
이는 다음과 같은 해결방법을 쓰셨을 거라 생각해요. 물론 이기적인 발상이라, 다른 방법도 있겠지만, 취지는 거의 비슷할 거라 생각합니다.
- 낮은 번호부터 시작해서, 자신보다 낮은 번호의 lost가 있을 경우에 일단 빌려주고
- 만약 없다면 자기보다 높은 번호의 lost를 빌려준다.
혹은 그 반대도 성립하겠죠?! 높은 번호부터 시작해서, 자신보다 높은 번호가 있다면 빌려주면 되니까요.
물론 여기까지는 정말 순항입니다. 하지만 다음 몇 가지를 주의해야합니다. 여기서부터 막힌 분들이 꽤 있으실 거 같아요!
첫째, 과연
reserve
는 정렬되어 있는가?
결과적으로는 NO!입니다. 😥 저도 맨 처음에 이를 의심했고, 없길래 이게 트릭이다! 싶어서 바로 넣었었죠.
하지만 저는 11케이스에서 막혔습니다. 그 이유는 무엇인가 고민했는데, 다음을 간과했더라구요.
둘째,
reserve
중, 당일날 도둑질 당한 사람이 있는가?
있다면 배열과 lost가 일치하는 학생 번호를 배열 둘 다 빼야 합니다. 번호가 안 적힌 사람과 동등한 상태에 놓여지기 때문이죠 (참가는 하지만, 다른 사람들에게 빌려줄 수는 없는 학생들)
결과적으로 이 둘을 고려해서 작성했다면, for
문만 순서대로 잘 돌린다면 원활히 pass
하실 거에요!
const solution = (n, lost, reserve) => {
reserve.sort((a, b) => a - b).forEach(student => {
if (lost.includes(student)) {
lost.splice(lost.indexOf(student), 1);
reserve = reserve.filter(now => now !== student)
}
})
reserve.forEach(student => {
if (lost.includes(student - 1)) lost.splice(lost.indexOf(student - 1) ,1);
else if (lost.includes(student + 1)) lost.splice(lost.indexOf(student + 1) ,1);
})
return n - lost.length;
}
쉽다고 생각하는 순간, 꼬이기 시작하는 것 같아요.
이를 예외처리를 주의하며, 차근차근히 문제를 접근해보려 노력해야겠습니다! 😋