[코테] 제일 작은 수 제거하기

JulyK9·2022년 12월 23일
0

문제

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

제출코드

function solution(arr) {
  	// 예시에서 배열 요소가 하나인 경우 가장 작은 수가 없는 케이스로 -1을 리턴하므로 먼저 예외 케이스 작성
    if(arr.length === 1) return [-1];
  
  	// 가장 작은 수 비교기준 설정
    let min = arr[0]
    
    // 반복문으로 가장 작은수 체킹하고 할당 
    for(let i = 1; i < arr.length; i++) {
      min > arr[i] ? min = arr[i] : null
    }
  
  	// filter로 가장 작은 수로 확인된 수를 제외한 배열 리턴
    return arr.filter(el => el !== min)
}

접근과정

  • 가장 ~한 수를 찾는 과정 : 기준을 잡고 반복문으로 비교해가며 찾기
  • filter 메서드로 필터링 (반환값은 필터링된 요소들을 포함하는 배열임을 상기)

다른 풀이 1.

function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    if(arr.length < 1) return[-1];
    return arr;
}
  • 가장 작은 숫자를 Math.min()으로 찾아내는데, 배열 안에 들어있는 숫자들을 비교해야 하므로 spread syntax로 풀어줌
    => 가장 작은 수를 메서드로 쉽게 찾아냄
  • 배열에서 지정된 요소를 찾기 위해 arr.indexOf()를 활용, 두번째 파라미터에 1을 넣어 인덱스 1부터 비교함
    => 지정 요소의 인덱스를 찾기 위해 indexOf() 활용
  • arr.splice()는 원본 배열을 변경하므로 최소값을 찾아내 제거한 상태를 return 해주면 답을 찾아낼 수 있음
    => splice 메서드가 mutable 하다는 것을 알고 있어야 활용 가능, 더불어 splice 메서드 결과의 반환값은 해당 요소를 담은 배열이라는 것도 숙지할 것

다른 풀이 2.

function solution(arr) {
    const min = Math.min(...arr);
    return arr.length !== 1 ? arr.filter(i => i !== min) : [-1]
}
  • 가장 작은 수를 Math.min() 메서드를 이용해서 찾고 변수에 할당
  • 전체적인 흐름을 삼항연산자로 표현함. 굿!
  • 예외 케이스 아닌 부분에서는 filter() 메서드로 간결하게 표현

다른 풀이 3.

function solution(arr) {
    let min = arr.reduce((p, c) => Math.min(p,c))
    let r = arr.filter(v => v !== min);
    r = r.length === 0 ? [-1] : r;
    return r;
}
  • arr.reduce() 메서드를 이용하여 가장 작은 수 찾아냄 (원본배열은 유지)
  • 변수 r 에는 filter 메서드를 이용하여 가장 작은 수를 제외한 엘리먼트를 담은 배열을 할당
  • 배열에 요소가 하나 밖에 없는 경우엔 가장 작은 요소(유일한 요소)와 같지 않은 것을 필터링하면 빈 배열이 리턴될 것이므로 r.length === 0 이 됨을 이용하여 삼항연산으로 처리

참고자료

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글