티스토리 뷰
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
코딩테스트 연습 - 체육복 | 프로그래머스
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체
programmers.co.kr
풀이
function solution(n, lost, reserve) {
var answer = 0;
let list = [];
for(let i = 0; i < n; i++) {
list[i] = 1;
if(lost.includes(i+1)) list[i]--;
if(reserve.includes(i+1)) list[i]++;
}
for(let j = 0; j < list.length; j++) {
if(list[j] > 0) answer++;
if(list[j] == 0 && list[j-1] == 2) {
list[j] = 1;
list[j-1] = 1;
answer++;
} else if (list[j] == 0 && list[j+1] == 2) {
list[j] = 1;
list[j+1] = 1;
answer++;
}
}
return answer;
}
- list 배열을 만들어 전체 학생별 체육복 보유 유무를 체크하기로 함
- for문을 돌며 기본적으로 1을 넣어주고, 만약에 분실(lost)목록에 있는 학생인 경우 1을 빼줌.
- 반대로 여분(reserve)목록에 있는 학생인 경우 1을 더해줌(두 목록에 다 있을 수 있기 때문에 더하기 빼기로 처리함)
- 채워진 리스트 배열을 돌면서, 0보다 클 때, 정답에 1을 더해줌(정답 = 체육복 있는 사람 수)
- 만약 체육복이 없고(값이 0), 앞의 친구나 뒤 친구가 여분이 있는 경우(값이 2), 각각 1로 처리해주고 정답에 1을 더해줌
- answer 리턴
다른 사람의 풀이1
function solution(n, lost, reserve) {
var arr = [];
for(var i=0; i<n;i++){
arr.push(1);
}
lost.forEach((value, index) =>{arr[value-1] -= 1})
reserve.forEach((value,index) => {arr[value-1] += 1});
arr.forEach((value,index,array) => {
if(value>1 && arr[index+1]===0){
array[index] --;
array[index+1] ++;
}else if(value===0 && arr[index+1]>1){
array[index] ++;
array[index+1] --;
}
})
return arr.filter(value => value>0).length;
}
forEach로 값을 비교해서 처리를 했고, 마지막에 filter()를 이용해서 0보다 큰 값들의 length를 반환했음.
다른 사람의 풀이2
function solution(n, lost, reserve) {
var answer = new Array(n).fill(1);
for(let i of lost) {
answer[i - 1]--;
};
for(let i of reserve) {
answer[i - 1]++;
};
for(let i = 0; i < answer.length; i++) {
var clothLength = answer[i];
if(clothLength === 2) {
if(answer[i + 1] === 0 || answer[i - 1] === 0) {
answer[i]--;
answer[i + ( answer[i + 1] === 0 ? 1 : -1 ) ]++;
};
};
};
return answer.filter(x => x >= 1).length;
}
forof문을 사용한 것과 객체생성이 눈에 띔. fill()로 한번에 수를 채운 뒤 lost, resever 값으로 인덱스를 구해 값을 더하고 빼줌.
그리고 0을 기준으로 찾은게 아니라, 여분이 있는 사람을 기준으로 답을 찾음.
역시 답은 filter()를 통해 반환함.
'1Day 1Algorithm' 카테고리의 다른 글
[DAY 17] 예산 (0) | 2019.10.17 |
---|---|
[DAY 16] 2016년 / 가운데 글자 가져오기 / 수박수박수박수박수박수? (0) | 2019.10.16 |
[DAY 14] 프로그래머스 스킬 체크 테스트 Level.2 (0) | 2019.10.14 |
[DAY 13] Equal Stacks @ (0) | 2019.10.13 |
[DAY 12] Time Conversion (0) | 2019.10.13 |
- Total
- Today
- Yesterday
- Props
- js
- 프로그래머스
- reduce()
- 우아한테크러닝
- sort
- Typescript
- 멀티프로그래밍
- 자바스크립트
- redux-saga
- 운영체제
- 웹팩
- 배열
- Array
- 타입스크립트
- 리액트
- 시분할시스템
- sort()
- 구간합
- greedyAlgorithm
- React
- 알고리즘
- 컴퓨터공학
- javascript
- 1day1algorithm
- 배치처리시스템
- 자료구조
- Algorithm
- OS
- Webpack
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |