코딩테스트 | (JavaScript) 프로그래머스 : 제일 작은 수 제거하기

trevor1107·2021년 8월 12일
1

✅문제

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

❕ 제한사항

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

🎹📢입출력 예제

✍풀어보기

function solution(arr) {
    let answer = [];
    let minIndex = 0;
    
    // arr이 [10]이면 배열 [-1]을 리턴한다.
        if(arr[0] == 10){
            answer.push(-1);
            return answer;
        }
    
    // 제일 작은 값의 인덱스를 찾는다.
    for(let i = 0; i < arr.length-1; ++i){
        if(arr[i+1] < arr[minIndex]){
            minIndex = i+1;
        }
    }
    
    // 제일 작은 값을 제외한 데이터를 배열에 추가한다.
    for(let i = 0; i < arr.length; ++i){
        if(minIndex == i) {
            continue;
        }
        answer.push(arr[i]);
    }
    
    // 결과 배열이 빈 배열인 경우 [-1]을 리턴한다.
    if(answer.length < 1)
        answer.push(-1);
    
    return answer;
}

너무 원초적으로 풀었다. 생각보다 첫번째 테스트 케이스 시간이 4.78ms라는 시간이 걸려서 당황스러웠다.. 뭔가 잘못 푼 느낌??? 나머지는 0.05~0.2ms정도로 나왔는데 말이다. 찝찝하다..


🎈다른 사람의 풀이

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

왜 다른 사람의 풀이는 [10]의 조건을 안 썼나? 생각해보니 문제를 다시 살펴보니 arr에서 가장 작은 수를 제거 한다는 것.. 그러니까 [1000]이든 [2500]이든 어떤 숫자든 배열의 요소가 한 개라면 무조건 제거하여 빈 배열이 된다. 그래서 [-1]를 리턴 해주면 된다는 것이었다.. 문제를 이제야 제대로 이해했다. 문제 자체는 단순한데, 이 단순한걸 너무 장황하게 풀었었다. 반성한다 ㅠㅠ

splice()는 array.splice(start[, deleteCount[, item1[, item2[, ...]]]])으로 start index부터 deleteCount(제거할 요소 갯수), item은 추가할 요소이며 배열의 데이터를 직접적으로 변경시키고, 제거한 요소들의 배열을 반환한다.
[4,7,13,17,19].splice(1,2) -> [4,17,9]

소스 코드를 해석하자면, 가장 작은값을 찾는다. Math.min(...arr) -> 가장 작은 값의 인덱스를 찾는다. arr.indexOf(minValue) -> 해당 인덱스의 요소를 제거한다. array.splice(minIndex, 1)

잠깐! 여기서 slice()와 헷갈릴 수도 있다. slice()는 array.slice([begin[,end]])으로 begin Index부터 end Index까지 요소를 담은 배열을 반환한다. 그리고 배열의 데이터를 직접적으로 변경시키지 않는다!
end를 지정하지 않으면 begin Index부터 마지막 요소까지 담은 배열을 치환한다.
그리고 음수를 지정하면 배열의 끝에서 부터 지정한다.
[3,5,7,9].slice(1,3); => return [5,7,9];
[3,5,7,9].slice(-2); => return [7,9];
[3,5,7,9,11].slice(1,-1); => return [5,7,9];



참고 자료 및 사이트 (감사합니다)

profile
프론트엔드 개발자

0개의 댓글