체육복
문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
예시
n | lost | reserve | return |
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
코드 해석 및 전체 코드
1. 반환할 변수의 초깃값을 최솟값으로 선언
2. 잃어버린 학생이 여벌 체육복을 가져왔는지 확인
3. 잃어버린 학생의 앞, 뒤 번호가 여벌 체육복을 가져왔는지 확인
정확성 테스트 12번만 실패하길래 무얼 잘못 작성했나 했더니만 잃어버린 학생이 여벌 체육복을 가져왔는지 미리 확인하지 않았던 것이다. 그래서 여벌을 가져왔는데도 앞번호 학생에게 빼앗기는 바람에...
1. 반환할 변수의 초깃값을 최솟값으로 선언
최솟값은 체육복을 잃어버리지 않은 학생 수를 전체 학생 수 - 잃어버린 학생 수이다.
2. 잃어버린 학생이 여벌 체육복을 가져왔는지 확인
이중 for문으로 바깥 for문은 lost 배열, 안쪽 배열은 reserve 배열로 reserve[j]와 lost[i]가 같을 시 lost와 reserve 배열에서 수를 제거해준다. 그리고 lost 배열 인덱스 수가 줄었기 때문에 i를 1 감소시켜준다.
3. 잃어버린 학생의 앞, 뒤 번호가 여벌 체육복을 가져왔는지 확인
이 이중 for문도 마찬가지로 반복하여 reserve[j]에 i의 ±i값이 있는지 확인 후 있을 시 반환값을 1 증가시키고 reserve 배열에서 수를 제거한다.
function solution(n, lost, reserve) {
var answer = n - lost.length;
for(let i = 0, m = 0; i < lost.length; i++){
for(let j = 0, n = 0; j < reserve.length; j++){
if(lost[i] == reserve[j]) {
lost.splice(i--, 1);
reserve.splice(j, 1);
answer++;
}
}
}
for(let i of lost){
for(let j = 0; j < reserve.length; j++){
if(i - 1 == reserve[j] || i + 1 == reserve[j]) {
answer++;
reserve.splice(j, 1);
break;
}
}
}
return answer;
}
'코딩 테스트 > [JS] programmers 코딩 테스트 연습' 카테고리의 다른 글
[Programmers/JS] JadenCase 문자열 만들기 / 프로그래머스 코딩 테스트 연습 (0) | 2021.12.21 |
---|---|
[Programmers/JS] N개의 최소공배수 / 프로그래머스 코딩 테스트 연습 (0) | 2021.12.20 |
[Programmers/JS] 모의고사 / 프로그래머스 코딩 테스트 연습 (0) | 2021.06.20 |
[Programmers/JS] 제일 작은 수 제거하기 / 프로그래머스 코딩 테스트 연습 (0) | 2021.06.20 |
[Programmers/JS] 로또의 최고 순위와 최저 순위 / 프로그래머스 코딩 테스트 연습 (0) | 2021.06.20 |
댓글