정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
| arr | return |
|---|---|
| [4,3,2,1] | [4,3,2] |
| [10] | [-1] |
우선 이 문제를 풀어내는데 실패했다.
입출력 예시를 기준으로 코드를 짰더니 테스트케이스에서 전부 실패했다.
function solution(arr) {
var answer = [];
arr.sort().shift()
arr.length === 0 ? answer = [-1] : answer = arr.reverse()
return answer;
}
코드를 적으면서도 이건 아니다 싶었는데 결과는 역시 꽝이었다.
어떻게 풀어야될 지 모르겠어서 시간낭비를 하다가 oneook - 제일 작은 수 제거하기 | 프로그래머스 이 글에서 .reduce를 사용하신 걸 보고서 나도 reduce를 사용해보자고 생각했다.
우선 필요사항을 정리해보면
이 세가지이다.
function solution(arr) {
// let arr = [4,3,2,1];
if (arr.length === 1) return [-1];
let res = arr.reduce((arr, cur) => arr < cur ? arr : cur)
let index = arr.indexOf(res);
arr.splice(index, 1);
return arr;
}
제일 처음에 배열의 길이가 1인 경우를 먼저 걸러냈다. 길이가 1인 경우에 [-1] 를 반환하게 만들었다.
배열 순서를 바꾸지 않으면서 요소끼리 비교해야했는데, 이 부분을 .reduce 를 이용했다. 아직 사용법이 익숙하지 않아서 순서대로 하나씩 적어봤다.
주의.
해당식에서.reduce에 초깃값을 주면 숫자 비교 시, 베열에 속하지 않은 숫자와 비교하게 되므로 초깃값을 주면 안된다.
| arr | cur | index | arr < cur ? arr : cur |
|---|---|---|---|
| 4 | 3 | 1 | 3 |
| 3 | 2 | 2 | 2 |
| 2 | 1 | 3 | 1 |
| 1 |
최솟값은 구했지만 해당 값을 빼버리기 위해서는 인덱스를 알아내야 한다. 그러므로 indexOf() 를 사용했다.
배열의 앞이나 뒤가 아닌 중간에 있는 요소를 삭제하기 위해서 .splice() 를 사용했다. .splice()를 사용하면 원본 배열이 빠져나간 요소를 제외한 배열로 변한다.
참조
Zerocho - map, reduce 활용하기
[Javascript] 배열 특정 값 위치(index) 찾기 - indexOf(), lastIndexOf()
[JavaScript] 배열의 특정 위치의 배열 요소 삭제
function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)),1);
if(arr.length<1)return[-1];
return arr;
}
...arr : baealex - JavaScript 기본 문법 정리 (11. 전개구문) 설명 링크 해당 링크 11번 카테고리에 있다.
Math.min() : hi.anna - [Javascript] 배열에서 최대값, 최소값 구하기 Math.max 및 Math.min 사용하는 방법이 설명되어 있다.
이번에도 모르는게 많이 나와서 공부 후 다시 정리!