문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다.
다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다.
학생들의 번호는 체격 순으로 매겨져 있어,
바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다.
예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다.
체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려
최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost,
여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때,
체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한 사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
문제 풀이 방법
- 각 번호의 학생들의 체육복 보유 수를 번호에 맞게 나열했다.
- 나열된 배열에서 양 옆의 체육복 수를 비교해 없다면 옆자리 학생의 체육복을 빌려 오게 했다.
- 여유분을 가져온 학생의 숫자를 1에서 하나 추가할 때 =2 로 하니 에러가 났다.
- += 1 로 하니 에러가 고쳐젔다. 용량아님 런타임 때문에 에러가 난거 같다.
- 다른 사람들이 짠 코드를 보니 +=로 해주는 것을 보고 참고했다.
코드
function solution(n, lost, reserve) {
let answer = 0;
let arr = [];
for(let i=0; i<n; i++){
arr[i] = 1
}
for(let i=0; i<lost.length; i++){
arr[lost[i]-1] = 0;
}
for(let i=0; i<reserve.length; i++){
arr[reserve[i]-1] += 1;
}
for(let i=0; i<arr.length; i++){
if(arr[i-1] === 2 && arr[i] === 0){
arr[i-1] = 1;
arr[i] = 1;
}
if(arr[i+1] === 2 && arr[i] === 0){
arr[i+1] = 1;
arr[i] = 1;
}
}
for(let i=0; i<arr.length; i++){
if(arr[i] > 0){
answer++;
}
}
console.log(arr);
console.log(answer)
return answer;
}
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
탐욕법(Greedy) / 2 / 큰 수 만들기 (0) | 2022.06.20 |
---|---|
탐욕법(Greedy) / 2 / 조이스틱 (0) | 2022.06.20 |
힙Heap / 3 / 이중우선순위큐 (0) | 2022.06.17 |
힙 heap / 3 / 디스크 컨트롤러 (0) | 2022.06.16 |
깊이 우선 탐색 / 3 / 여행경로 (JS) 부족... (0) | 2022.06.15 |
문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다.
다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다.
학생들의 번호는 체격 순으로 매겨져 있어,
바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다.
예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다.
체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려
최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost,
여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때,
체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한 사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
문제 풀이 방법
- 각 번호의 학생들의 체육복 보유 수를 번호에 맞게 나열했다.
- 나열된 배열에서 양 옆의 체육복 수를 비교해 없다면 옆자리 학생의 체육복을 빌려 오게 했다.
- 여유분을 가져온 학생의 숫자를 1에서 하나 추가할 때 =2 로 하니 에러가 났다.
- += 1 로 하니 에러가 고쳐젔다. 용량아님 런타임 때문에 에러가 난거 같다.
- 다른 사람들이 짠 코드를 보니 +=로 해주는 것을 보고 참고했다.
코드
function solution(n, lost, reserve) {
let answer = 0;
let arr = [];
for(let i=0; i<n; i++){
arr[i] = 1
}
for(let i=0; i<lost.length; i++){
arr[lost[i]-1] = 0;
}
for(let i=0; i<reserve.length; i++){
arr[reserve[i]-1] += 1;
}
for(let i=0; i<arr.length; i++){
if(arr[i-1] === 2 && arr[i] === 0){
arr[i-1] = 1;
arr[i] = 1;
}
if(arr[i+1] === 2 && arr[i] === 0){
arr[i+1] = 1;
arr[i] = 1;
}
}
for(let i=0; i<arr.length; i++){
if(arr[i] > 0){
answer++;
}
}
console.log(arr);
console.log(answer)
return answer;
}
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
탐욕법(Greedy) / 2 / 큰 수 만들기 (0) | 2022.06.20 |
---|---|
탐욕법(Greedy) / 2 / 조이스틱 (0) | 2022.06.20 |
힙Heap / 3 / 이중우선순위큐 (0) | 2022.06.17 |
힙 heap / 3 / 디스크 컨트롤러 (0) | 2022.06.16 |
깊이 우선 탐색 / 3 / 여행경로 (JS) 부족... (0) | 2022.06.15 |