programmers/level1

[level1] - 제일 작은 수 제거하기

태기의삶 2020. 7. 14. 19:21

 

 

 

코딩테스트 연습 - 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1

programmers.co.kr

 

문제 설명 :

정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를 들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 return하고, [10]이면 [-1]을 return합니다.

입력 : [4,3,2,1]

출력 : [4,3,2]

 

입력 : [10]

출력 : [-1]

 

접근 방법 :

배열에서 가장 작은 수를 제거한 배열을 반환하면 되기 때문에, 일단 배열을 내림차순으로 정렬하고 pop()을 통해 맨 뒤에 가장 작은 수를 없애버리면 해결될 거라 생각했다.

그래서 바로 로직을 짰다.

처음 로직은 이렇게 심플했다.

function solution(arr) {
    arr.sort((a, b) => b - a).pop();
    return arr.length < 2 ? [-1] : arr;
}

하지만 모든 테스트를 통과하지는 못했다. 좌절... 😥

왜 그런가 질문하기에 있는 질문들을 모두 참고해서 보았다.

그 결과, 기존 배열의 순서를 그대로 유지하면서 가장 작은 수만 빼내야 했던 것이었다.

예를 들어, [5, 1, 8, 7]에서 sort()로 정렬하면, [8, 7, 5, 1]로 내림 차순으로 정렬이 된다.

그러나, 이렇게 되면 기존 배열의 순서를 건드리게 된다.

이것이 아니라, [5, 1, 8, 7] 이 형식을 유지하면서 가장 작은 수 1을 뺀 [5, 8, 7]을 반환해야 하는 것이었다.

그래서 생각한 방법은 바로 배열을 복사하는 것이다.

배열을 복사해서 그 복사한 배열에서 가장 작은 수를 추출한 다음, 기존 배열에서 가장 작은 수를 slice()와 indexOf()를 통해 추출하면 모든 테스트 케이스가 통과가 되는 것을 확인할 수 있었다.

 

내가 짠 코드 :

function solution(arr) {
    let answer = [...arr];
    const min = answer.sort((a, b) => b - a).pop();
    arr.splice(arr.indexOf(min),1);
    return arr.length < 2 ? [-1] : arr;
}