[프로그래머스] 체육복 (Javascript, 자바스크립트)

young_pallete·2021년 8월 1일
0

Algorithm

목록 보기
5/32
post-thumbnail

시작하며 🌈

정렬은 이미 간파했고, 생각보다 쉬웠다고 생각했는데 생각보다 당황스러운 예외 케이스가 있던 문제였어요.
아무래도 이 글을 보고 계신 분들께서는 예외처리를 한 번 더 고민하시고 보시면 될 거 같습니다 😘 충분히 풀 수 있을 거에요!

그럼에도 잘 모르겠다! 싶으면 다음 풀이과정에서 발생하는 예외케이스들을 고민해보시면 될 듯 합니다.

풀이과정 📃

먼저 다음을 고민해야 해요.

어떻게 최대 참여자 수를 보장할 수 있는가?

이는 다음과 같은 해결방법을 쓰셨을 거라 생각해요. 물론 이기적인 발상이라, 다른 방법도 있겠지만, 취지는 거의 비슷할 거라 생각합니다.

  1. 낮은 번호부터 시작해서, 자신보다 낮은 번호의 lost가 있을 경우에 일단 빌려주고
  2. 만약 없다면 자기보다 높은 번호의 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;
}

마치며 👏

쉽다고 생각하는 순간, 꼬이기 시작하는 것 같아요.
이를 예외처리를 주의하며, 차근차근히 문제를 접근해보려 노력해야겠습니다! 😋

profile
People are scared of falling to the bottom but born from there. What they've lost is nth. 😉

0개의 댓글