[Programmers] 제일 작은 수 제거하기 - JS

devMag 개발 블로그·2022년 1월 19일

프로그래머스 문제 링크

문제 설명

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

제한 조건

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

입출력 예시

arrreturn
[4,3,2,1][4,3,2]
[10][-1]



나의 풀이 - 실패

우선 이 문제를 풀어내는데 실패했다.
입출력 예시를 기준으로 코드를 짰더니 테스트케이스에서 전부 실패했다.

  1. 처음에는 주어진 배열을 순서대로 정렬하고 맨 앞에 있는 가장 작은 숫자를 빼주었다.
  2. 배열의 길이가 1일 경우에는 [-1] 을 넣어주고 아닌 경우에는 정렬시켰던 배열을 다시 재정렬 시킨다음 리턴해줬다.
function solution(arr) {
    var answer = [];
    arr.sort().shift()
    arr.length === 0 ? answer = [-1] : answer = arr.reverse()
    return answer;
}

코드를 적으면서도 이건 아니다 싶었는데 결과는 역시 꽝이었다.


아이디어 본 뒤에 다시 풀어보기

어떻게 풀어야될 지 모르겠어서 시간낭비를 하다가 oneook - 제일 작은 수 제거하기 | 프로그래머스 이 글에서 .reduce를 사용하신 걸 보고서 나도 reduce를 사용해보자고 생각했다.

우선 필요사항을 정리해보면

  • 배열 순서를 바꾸지 않아야 한다.
  • 배열의 요소끼리 서로 비교해서 가장 작은 숫자를 찾아야한다.
  • 특정 인덱스의 배열 요소를 삭제시켜야한다.

이 세가지이다.


function solution(arr) {
  // let arr = [4,3,2,1];
  if (arr.length === 1) return [-1];
  
  let res = arr.reduce((arr, cur) => arr < cur ? arr : cur)
    
  let index = arr.indexOf(res);
    
  arr.splice(index, 1);

  return arr;
}
  1. 제일 처음에 배열의 길이가 1인 경우를 먼저 걸러냈다. 길이가 1인 경우에 [-1] 를 반환하게 만들었다.

  2. 배열 순서를 바꾸지 않으면서 요소끼리 비교해야했는데, 이 부분을 .reduce 를 이용했다. 아직 사용법이 익숙하지 않아서 순서대로 하나씩 적어봤다.

    주의.
    해당식에서.reduce에 초깃값을 주면 숫자 비교 시, 베열에 속하지 않은 숫자와 비교하게 되므로 초깃값을 주면 안된다.

    arrcurindexarr < cur ? arr : cur
    4313
    3222
    2131
    1
  3. 최솟값은 구했지만 해당 값을 빼버리기 위해서는 인덱스를 알아내야 한다. 그러므로 indexOf() 를 사용했다.

  4. 배열의 앞이나 뒤가 아닌 중간에 있는 요소를 삭제하기 위해서 .splice() 를 사용했다. .splice()를 사용하면 원본 배열이 빠져나간 요소를 제외한 배열로 변한다.

참조
Zerocho - map, reduce 활용하기
[Javascript] 배열 특정 값 위치(index) 찾기 - indexOf(), lastIndexOf()
[JavaScript] 배열의 특정 위치의 배열 요소 삭제



다른 풀이

function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    if(arr.length<1)return[-1];
    return arr;
}
  1. ...arr : baealex - JavaScript 기본 문법 정리 (11. 전개구문) 설명 링크 해당 링크 11번 카테고리에 있다.

  2. Math.min() : hi.anna - [Javascript] 배열에서 최대값, 최소값 구하기 Math.max 및 Math.min 사용하는 방법이 설명되어 있다.

이번에도 모르는게 많이 나와서 공부 후 다시 정리!

profile
최근 공부 내용 정리 Notion Link : https://western-hub-b8a.notion.site/Study-5f096d07f23b4676a294b2a2c62151b7

0개의 댓글