[JS] 연습문제 > 제일 작은 수 제거하기
function solution(arr) {
var a = arr.map(v => v);
arr.sort((a,b)=>a-b);
a = a.filter((v,i) => a[i] > arr[0]);
return a.length == 0 ? [-1] : a;
}
이번 문제는 풀면서 실수?가 많았다.
실수 1.
처음에는 arr을 내림차순으로 정렬하고 pop()으로 마지막 숫자만 뺀 후 리턴을 했는데 계속 답이 틀렸다고 ....
분명 테스트케이스는 맞다고 하는데!
생각해보니 arr이 [1,2,3,4]라면 제일 작은 숫자인 1을 빼고 [2,3,4]를 그대로 리턴해야 했다.
그런데 나는 정렬을 시켜버려서 답이 틀렸던 것..
실수 2.
위의 실수1을 깨닫고 변수 a에 arr을 저장하고 a와 arr을 비교하려 했다.
그런데 var a = arr 이렇게 변수에 담으면 얕은복사가 되어 arr을 정렬해버릴 때 a의 값도 arr이 정렬된 값처럼 변해버린다.
그래서 filter를 해서 값을 비교해도 a랑 arr의 값이 모두 같으니까 필터링된 값이 없다고 나오는 것....
결론
깊은 복사를 위해 map으로 새 배열을 만들어 주었고, arr은 오름차순을 해서 0번 인덱스에 가장 작은 수가 오도록 했다.
a 배열을 필터링해서 a[i]의 값이 arr[0]의 값 즉 가장 작은 수보다 큰 값만 배열에 담기게 했다
a가 [1,2,3,4]고 arr[0]이 1이라면 필터링된 a는 [2,3,4]만 담기게 된다!
배열에 아무것도 없으면 [-1]을 리턴하고 값이 있으면 a자체를 리턴해서 문제 해결
연습문제인데도 문제를 푸니까 7점이나 줬다.
테스트케이스가 [4,3,2,1] 이런식으로 있어서 다들 함정에 걸려버린 듯....ㅠ

function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)),1);
if(arr.length<1)return[-1];
return arr;
}
다른 사람 풀이
splice를 사용해서 원하는 인덱스만 잘라낼 수가 있다.
splice(인덱스, 길이) 이렇게 사용하면 되는데, 인덱스의 자리에 Math.min(...arr)을 사용해 arr 배열에서 가장 작은 수를 고르고 arr.indexOf로 그 수의 위치를 찾아냈다.
가장 작은 수 하나만 자르면 되기 때문에 길이에는 1을 입력