점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
function solution(n, lost, reserve) {
const students = new Array(n).fill(1)
lost.forEach((student) => {
students[student-1]--;
})
reserve.forEach((student) => {
students[student-1]++;
})
for(let i =0; i < students.length;i++) {
if(students[i] === 0 && students[i-1] === 2) {
students[i-1]--
students[i]++
} else if (students[i] === 0 && students[i+1] === 2) {
students[i+1]--
students[i]++
}
}
return students.filter(student => student >= 1).length
}
이 문제는 나에게 어려웠다.
문제에 따라 생각을 정리하고 코드를 작성하기 시작했는데 정리가 덜 된 건지 내가 잘 못 작성한 건지 코드가 생각처럼 작동 하지 않았다.
(핑계를 대보자면 요즘 잠을 잘 못 자는데 오늘 2시간 자서 그렇다고 하고싶...)
처음에는 students
배열을 새로 만들지 않고 lost
, reserve
를 각각 filter로 걸러서 비교하는 방법을 사용하려고 했는데 이 부분이 생각한 것처럼 작동 되지 않아서 헤매다가 그냥 새 배열을 만들어서 쓰는 방법으로 바꾸었다.
요즘 filter 쓰는 것에 살짝 꽂혀서 여기저기 쓰고 있는지라 반드시 filter를 쓰겠다는 집념이 return에 나타난다...ㅋㅋㅋㅋㅋㅋ
새 배열을 이용한 방법은 생각보다 쉽게 풀 수 있었다.
테스트 케이스 통과하는데서 버벅거리긴 했지만 +-를 거꾸로 작성해서 통과가 안 되었던 부분이라 역시 오타부터 봐야되구나 싶었다.
function solution(n, lost, reserve) {
const students = new Array(n).fill(1)
lost.forEach((student) => {
students[student-1]--;
})
reserve.forEach((student) => {
students[student-1]++;
})
students.forEach((student, i) => {
if(students[i] === 0 && students[i-1] === 2) {
students[i-1]--
students[i]++
} else if (students[i] === 0 && students[i+1] === 2) {
students[i+1]--
students[i]++
}
})
return students.filter(student => student >= 1).length
}
기존의 for문을 forEach로 바꾸었다. 전반적으로 보기 좋게 하고 싶기에 별로 만족스럽지는 않다.
게다가 naming... 진짜 너무 어려운 것같다. 다른 사람의 풀이를 볼 때마다 느끼지만 naming이 가독성에 어마어마한 영향을 끼친다는 걸 새삼 알게된다. 지금도 만족스러운 이름들을 아니지만 많이 써보면서 내 스타일을 찾아나가야겠다.