점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
n | lost | reserve | return |
---|---|---|---|
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
// number_of_students은 전체 학생 수
// lost는 체육복을 도난 당한 학생들의 번호가 담긴 배열
// reserve는 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열
//체육복은 앞, 뒤로만 빌려줄 수 있다.
let gym_suit = [];
let cnt_gym_suits = 0;
let number_of_students = 0;
let lost = [];
let reserve =[];
function solution(number_of_students,lost,reserve) {
//학생 수 만큼 체육복을 만든다.
for (let i = 0; i < number_of_students; i++) {
//모든 학생은 기본적으로 체육복이 있었다.
gym_suit[i] = 1;
}
//여분의 체육복을 가져온 학생들에 대한 배열을 만든다.
for (let i = 0; i < reserve.length; i++) {
//여분의 체육복을 가진 학생은 2가 된다.
gym_suit[reserve[i]-1] = 2;
}
//도난 당하고 난 후의 배열을 만든다.
for (let i = 0; i < lost.length; i++) {
//0이 아닌 굳이 -1을 한 이유는 여분을 체육복을 가진 학생은 체육복이 1개 더 있기 때문이다.
gym_suit[lost[i]-1] = gym_suit[lost[i]-1] - 1;
}
//gym_suit 배열을 반복시키면서 만약 값이 0이면 뒤 index에서 체육복을 가져오고 체육복을 준 학생은 1을 리턴한다.
//체육복 빌려주는 배열
for (let i = 0; i < gym_suit.length; i++) {
// [1, 2, 0, 2, 0] 이런 경우에 만약 3번째 학생이 4번째 학생에게 옷을 먼저 빌리면
// [1, 2, 1, 1, 0] 이 되어 체육을 많이 들을 수 없다. 따라서 3번째 학생은 2번째 학생에게 먼저 빌리고 5번째 학생도 4번째 학생에게 먼저 빌려야 한다.
// 위와 같은 이유로 아래 조건식이 밑의 조건식보다 먼저 나왔다.
if(gym_suit[i] === 0 && gym_suit[i-1] === 2){
gym_suit[i] = 1;
gym_suit[i-1] = 1;
}
if(gym_suit[i] === 0 && gym_suit[i+1] === 2){
gym_suit[i] = 1;
gym_suit[i+1] = 1;
}
}
//체육복 있는 학생을 cnt 하는 반복
for (let i = 0; i < gym_suit.length; i++) {
if(gym_suit[i] > 0){
//체육복을 가진 학생수를 세는 코드이다.
cnt_gym_suits ++;
}
}
return cnt_gym_suits;
}
//테스트 하기위한 함수의 실행 부분이다.
solution(6,[1,2,4,5],[3])