Coding test

[프로그래머스] 제일 작은 수 제거하기 (Level 1)

Jiwoo 2022. 4. 15. 17:18

문제

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

  • 제한 조건
    • arr은 길이 1 이상인 배열입니다.
    • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
       

나의 풀이

  1. 첫번째 풀이

    정렬 후, arr[0] 값을 삭제하는 방식
     

    function solution(arr) {
    
       // return 제일작은수 삭제한 배열
       // 빈 배열 => return -1
       let result = arr.slice(0);
    
       // arr = arr.filter((정렬->가장작은값)아닌 요소)
       result = result.filter(i => i !== arr.sort((a,b) => a - b)[0]);
    
       // if (arr.length === 0) return [-1];
       if (result.length === 0) return [-1];
    
       // else return arr;
       return result;
    }

     
    처음에는 let result = arr로 썼었는데, arr.sort()를 하자 result도 함께 변경되었다.
    배열은 참조형이기 때문에 변수가 값만 복사하는 것이 아니라, 메모리 주소를 참조하기 때문에 그렇다.
    그래서 arr.slice()를 통해 새로운 변수를 만들어주고 진행했다.
     

    • 정확도 테스트 결과


      테스트 1을 시간초과로 통과하지 못했다.
      정렬하는데 시간이 오래걸리는 것 같아, 정렬하지 않고 해결할 방법을 찾았다.
       

  2. 두 번째 풀이

    Math.min()을 통해 최솟값을 구하는 방법
     

    function solution(arr) {
    
       // return 제일작은수 삭제한 배열
       // 빈 배열 => return -1
    
       // 최소값 = Math.min(arr요소)
       // return arr.filter(최소값 아닌 수)
       arr = arr.filter(e => e !== Math.min.apply(...arr));
    
       return arr.length === 0 ? [-1] : arr;
    }

     
    여기서 유의할 점은 Math.min(array)로 쓰면 안된다는 것이다.
    인수로 배열이 아닌 값들을 전달해야 하기 때문에, 배열을 인수로 해서 함수를 호출해주는 apply()를 사용해야 한다.
     

    • 배열 요소 중 최댓값/최소값 구하기

      • 최댓값 : Math.max.apply(...array)
      • 최소값 : Math.min.apply(...array)
         
    • 정확도 테스트 결과


      테스트 1번 시간이 오래 걸리긴 했지만, 통과했다.
       

다른 풀이

function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    if(arr.length<1)return[-1];
    return arr;
}

 
센스있고 깔끔한 풀이
arr.splice()arr.indexOf()를 적재적소에 사용했다.
splice를 이용해 최솟값의 인덱스를 삭제하고, arr를 아예 변형시켜 반환.
 

  • 정확도 테스트 결과


    시간도 엄청나게 절약된다