Lev.1 제일 작은 수 제거하기
프로그래머스 제일 작은 수 제거하기
문제 설명
정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를 들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴하고, [10] 면 [-1]을 리턴합니다.
제한사항
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr [i] ≠ arr [j]입니다.
직접 풀이 결과
let arr = [4, 3, 2, 1, 5];
let arr2 = [10];
function solution(arr) {
if (arr.length <= 1) { // 배열의 길이가 1보다 낮거나 같을 시 -1을 리턴해준다
return -1;
} else {
return arr.sort().splice(1).reverse(); // 낮은순으로 정렬한 후, 제일 앞에 배열을 삭제, 다시 배열을 뒤집어서 반환해준다.
}
}
console.log(solution(arr)); // [5,4,3,2]
console.log(solution(arr2)); // -1
테스트 결과는 제대로 나오는데, 채점 시 0점이 나온다..
이유는 즉슨 배열의 순서가 중요한 자료일 경우도 있기 때문에
배열의 순서를 바꿔서는 안 된다고 한다.
그러면 진작에 제한사항에 알려주면 되는 거 아닌가 싶기도 하다.
그래서 다른 분들의 풀이를 참고해봤다.
참고 풀이 결과
let arr = [4, 3, 2, 1, 5];
let arr2 = [10];
function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)), 1);
return arr.length ? arr : [-1];
}
console.log(solution(arr)); // [4,3,2,5]
console.log(solution(arr2)); // [-1]
다른 분이 풀이한 것을 참고하였다. 정상적으로 채점되었다.
사용된 메서드는 splice, indexOf, Math.min, 스프레드 문법(...), 삼항 조건식이다.
위 코드가 작동하는 순서를 나열해보자, 안쪽부터 보면 좀 더 편하다.
1. 스프레드 문법으로 arr배열을 복사하여 Math.min 요소로 넣어, 배열중에 최솟값을 찾아낸다.
return 1
2. indexOf에서 1을 받아 호출된다. indexOf는 배열에서 지정된 요소의 첫 번째로 발견되는 인덱스 번호를 반환해준다.
return 3
3. splice는 첫 번째 인자로 삭제를 시작할 인덱스 번호를 받고, 두 번째 인자는 시작점부터 몇 개를 삭제할지 받는다.
3과 1을 넣어 호출했기 때문에 3번째 요소에서 1개를 삭제한다,
여기서 배열에 들어있는 1이 삭제되었다.
4. 삼항 조건 연산자에서 배열의 길이가 0일 경우(false) [-1]을 반환하고,
그 외에는 위에서 가공한 arr 배열을 반환해준다.
후기
내가 처음 시도한 방법은 배열을 정렬하고, 자르고, 뒤집고 난리도 아니었지만,
배열의 순서를 보존하며 가공하는 방식도 있음을 알았다.