https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
해결 과정
문제 자체는 이해가 쉬웠다. 어떤 학생이 체육복 여벌이 있으면 그 학생(인덱스) 앞 혹은 뒤에 체육복을 도난당한 친구가 있으면 자신의 체육복을 빌려주면 된다. 단, 체육 수업을 들을 수 있는(=체육복을 가지는) 학생의 최댓값을 구해야한다.
가장 많은 학생이 체육복을 가지기 위해서 나는 여러가지 과정을 설계했다.
1. 처음 세팅을 학생 인원만큼 배열을 만들고 처음엔 모두 체육복을 가지고 있다(1)
const students = new Array(n).fill(1);
2. lost, reverse 배열을 통해 도난 당한 학생은 1을 빼주고 여벌의 체육복을 가진 학생은 1을 더한다.
reserve.map(it => {
students[it-1]++;
})
lost.map(it => {
students[it-1]--;
})
3. 여기서 중요한 부분이 나온다. 내가 여벌의 체육복을 가진 학생이면 내 왼쪽, 오른쪽 학생에게 체육복을 줄 수 있다.
최대한 많은 학생이 체육복을 가지려면 첫 번째 인덱스부터 시작해서 내 왼쪽 학생에게 먼저 체육복을 주면 된다. (절대 오른쪽 부터 주면 안 된다)
그리디와도 관련이 있는데 내 선택이 최선의 선택을 해야한다. 만약 오른쪽 학생에게 체육복을 우선적으로 준다면 체육복이 남아 왼쪽 학생에게 못 주는 경우가 생긴다. 배열의 인덱스(학생) 어느 k 인덱스 일 때 내가 왼쪽을 우선적으로 챙겨줬을 때, 내 오른쪽(k+2) 인덱스에서 아까 못준 k+1 학생에게 체육복을 줄 수 있기 때문이다
for(let j = 0; j < n; j++){
if(students[j] === 2) {
if(students[j-1] === 0) {
students[j]--;
students[j-1]++;
}else if(students[j+1] === 0){
students[j]--;
students[j+1]++;
}
}
}
4. 체육복을 가진 학생(=값이 1인)을 필터로 거른 후 length을 반환한다.
return students.filter(it => it >= 1).length;
전체 코드
function solution(n, lost, reserve) {
const students = new Array(n).fill(1);
reserve.map(it => {
students[it-1]++;
})
lost.map(it => {
students[it-1]--;
})
for(let j = 0; j < n; j++){
if(students[j] === 2) {
if(students[j-1] === 0) {
students[j]--;
students[j-1]++;
}else if(students[j+1] === 0){
students[j]--;
students[j+1]++;
}
}
}
return students.filter(it => it >= 1).length;
}
'JavaScript > 알고리즘(JS)' 카테고리의 다른 글
[프로그래머스 레벨2] 스킬트리 [Javascript/ 문자열 처리] (0) | 2023.04.15 |
---|---|
[프로그래머스 레벨2] 게임 맵 최단거리 [Javascript/ BFS] (0) | 2023.03.26 |
[프로그래머스 레벨2] 타켓 넘버 [Javascript/ DFS] (0) | 2023.03.06 |
[프로그래머스 레벨2] 가장 큰 수 [Javascript/ 정렬] (0) | 2023.03.06 |
[프로그래머스 레벨2] H-Index [Javascript/ 정렬] (0) | 2023.03.06 |