정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
arr | return |
---|---|
[4,3,2,1] | [4,3,2] |
[10] | [-1] |
function solution(arr) {
let answer = [];
let small = arr.sort()[0]
if(arr.length === 1){
answer[0]=-1
} else {
answer = arr.filter((list)=>{
return list !== small
})
}
}
배열과 객체의 참조 개념을 인식하지 못하고 그대로 복사를 해서
원본이 같이 변경 되어, 원하는 결과를 낼 수 없었다.
그래서 찾아본 결과
문자, 숫자, 그리고 boolean 은 참조의 개념이 존재하지 않지만,
객체와 배열은 데이터 불변성을 유지시키기 위해 참조의 개념이 존재한다.
객체에서 = 을 통해 복사하게 된다면, 복사가 아닌 참조가 된다.
function solution(arr) {
let answer = [];
let small = arr.slice("").sort()[0]
if(arr.length <= 1){
return [-1]
} else {
arr.splice(arr.indexOf(small),1)
return arr
}
}
위처럼 풀었는데 테스트 케이스 2,5,6 번에서 실패되었다.(왜.. 왜...😮💨)
*추가
sort()안에 오름차순을 해주지 않아서 에러가 났다.
➀ sort()함수 안에 파라미터가 입력 되지 않으면 유니코드 순서대로 반환한다.
➁ 숫자 크기대로 정렬하기 위해서 함수 안에 파미터로 정의해주면 되었다.
let arr = [1,4,10,20]
➀ 👉🏻 arr.sort(); // [ 1, 10, 20, 4 ]
➁ 👉🏻 arr.sort((a,b)=> a-b) // [ 1, 4, 10, 20 ]
function solution(arr) {
let answer = [];
let small = arr.slice((a,b)=>a-b).sort()[0]
if(arr.length <= 1){
return [-1]
} else {
arr.splice(arr.indexOf(small),1)
return arr
}
}
// success 😎
다른 방법을 찾아본 결과.
Math.min()를 사용하여 해결 한 답안을 보았다.
Math.min()으로 사용하여 sort를 이용해 배열을 변경해 줄 필요 없이 바로 작은 수의 요소를 찾아 낼 수 있었다.
function solution(arr) {
let answer = [];
if(arr.length <= 1){
return answer = [-1]
} else {
arr.splice(arr.indexOf(Math.min(...arr)),1)
return answer = arr
}
}
function solution(arr) {
let copyArr = arr.slice();
if(arr.length <= 1) return [-1];
copyArr.sort((a, b) => a - b);
let remove = copyArr.shift()
arr.splice(arr.indexOf(remove),1)
return arr;
}
// 이 문제 풀이를 보고 기존 오류냈던 내 답안을 해결 할 수 있었다.
// 땡큐