1. 문제
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주
제한사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
입출력 예
n | lost | reserve | return |
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
입출력 예 설명
입출력 예 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
입출력 예 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
2. 정답 풀이
풀이 전략
- 학생을 key, 체육복 수를 value로 하는 Map 객체를 생성한다.
- 여벌이 있는 경우(reserve에 학생 번호가 있는 경우) +1
- 도둑 맞은 경우(lost에 학생 번호가 있는 경우) -1
- for of 문으로 value를 순회하며 여벌이 있는 경우 앞 뒤 학생의 체육복 수를 확인하여 빌려준다. (본인 value -1, 앞 or 뒤 value +1)
function solution(n, lost, reserve) {
const map = new Map();
for(let i=1; i<=n; i++) {
map.set(i, 1); // 최초 체육복 1벌
if(reserve.includes(i)) map.set(i, map.get(i)+1); // 여벌이 있는 경우 +1
if(lost.includes(i)) map.set(i, map.get(i)-1); // 도둑 맞은 경우 -1
}
for(let [key, value] of map) {
if(value > 1) {
if(map.get(key-1) === 0) {
map.set(key-1, 1);
map.set(key, 1);
} else if(map.get(key+1) === 0) {
map.set(key+1, 1);
map.set(key, 1);
}
}
}
return Array.from(map.values()).filter(value => value > 0).length // 체육복 1벌 이상인 학생 수 리턴
}
느낀 점
- Map 객체 사용하니까 시간 복잡도 걱정할 일이 줄어든 것 같다.
- 코드가 간결한 것 같은데, 직관적이지 못한 것 같다... 주석 없어도 알아볼 수 있는 코드 짜는 연습하자..😅
'코딩 테스트 > 프로그래머스(LV1)' 카테고리의 다른 글
[프로그래머스] 햄버거 만들기 (LV1 - JavaScript) (1) | 2024.10.20 |
---|---|
[프로그래머스] 숫자 짝꿍 (LV1 - JavaScript) (3) | 2024.10.19 |
[프로그래머스] 완주하지 못한 선수 (LV1 - JavaScript) (2) | 2024.10.15 |
[프로그래머스] 대충 만든 자판 (1) | 2024.10.13 |
[프로그래머스] 둘만의 암호 (LV1 - JavaScript) (1) | 2024.10.12 |