개발하는 무민

[프로그래머스-Level1] 제일 작은 수 제거하기_JavaScript + splice() 본문

Algorithm/Programmers

[프로그래머스-Level1] 제일 작은 수 제거하기_JavaScript + splice()

무민_ 2022. 6. 1. 17:32

제일 작은 수 제거하기

문제 설명

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

 

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

 

입출력 예
arr                                  return
[4,3,2,1] [4,3,2]
[10] [-1]

 

풀이

// 배열 중 가장 작은 수를 제거하고 나머지 요소를 그대로 반환
// 작은 수를 제거한 배열이 빈 배열인 경우 -1 반환
// 입력 받은 배열 중 indexOf와 Math.min을 사용해서 
// 가장 작은 값과 그 값의 인덱스를 찾아낸 뒤 splice를 사용해 제거
// 작은 수를 제거한 배열이 빈 배열인지는 삼항 다항식으로 확인

// splice() : 배열의 기존 요소를 삭제 or 교체 or 새 요소 추가하여 배열 내용 변경, 원본 배열 자체를 수정한다.

const solution = (arr) => { 
    arr.splice(arr.indexOf(Math.min(...arr)), 1);
    
    // Math.min(...arr) : 배열의 최소값 찾기
    // 최소값을 찾아 indexOf로 인덱스를 구해 1개의 값을 splice로 삭제
    
    return arr.length? arr : [-1]; //  arr의 길이가 0이라면 false 이므로 -1 리턴, 0이 아니라면 true이므로 arr의 값을 리턴
};

(꼭 기본적으로 제공되는 solution 함수 형태가 아니어도 정답으로 인정된다.)

 

- splice()

: 배열의 기존 요소를 삭제 or 교체 or 새 요소를 추가해서 배열의 내용을 변경하는 메소드, 원본 배열 자체를 수정한다.

사용하는 형태는 다음과 같다.

splice(start[ , deleteCount[ , item1 [ , item2[ , ...]]]])

- start : 배열의 변경을 시작하는 인덱스의 값

음수를 지정하는 경우 : 배열의 끝에서 요소를 센다.

배열의 길이보다 큰 수를 지정하는 경우 : 실제 시작 인덱스는 배열의 길이로 설정된다.

절대값이 배열의 길이보다 큰 경우 : 0으로 세팅된다.

 

- deleteCount : 배열에서 제거할 요수의 개수

생략 or 값이 array.length - start 보다 큰 경우 : start부터 모든 요소 ㅈ거함

0 이하의 수 : 어떤 요소도 제거되지 않는다

 

- item1, item2, ... : 배열에 추가할 요소

지정하지 않는 걍우 : splice()는 배열의 요소를 제거하는 일만 수행한다.

 

- return 값 : 제거할 요소를 담은 배열

아무 값도 제거하지 않았으면 빈 배열을 반환한다.

 

예시는 다음과 같다.

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; 

var arr1 = arr.splice(10, 2, 'a', 'b', 'c'); 

console.log(arr);   // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "a", "b", "c"]
console.log(arr1);  // [11, 12]

splice()는 원본 배열인 arr을 변경한다.

10번째 인덱스부터, 2개의 요소를 삭제하고, 'a', 'b', 'c' 세개의 char를 추가하도록 인자를 전달했으므로

11과 12가 삭제되고, 맨 뒤에 a b c 세 개의 값이 부어서 arr에 담기게 된다.

arr1 에는 잘라낸 11과 12가 담기게 된다.

 

참고 : https://wooder2050.medium.com/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A0%9C%EC%9D%BC-%EC%9E%91%EC%9D%80-%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0-javascript-270068f29ded