코테

Lev.1 제일 작은 수 제거하기

sungtt 2022. 4. 19. 01:04

프로그래머스 제일 작은 수 제거하기

 

문제 설명 

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

 

제한사항

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

 

직접 풀이 결과

let arr = [4, 3, 2, 1, 5];
let arr2 = [10];
function solution(arr) {
  if (arr.length <= 1) { // 배열의 길이가 1보다 낮거나 같을 시 -1을 리턴해준다
    return -1;
  } else {
    return arr.sort().splice(1).reverse(); // 낮은순으로 정렬한 후, 제일 앞에 배열을 삭제, 다시 배열을 뒤집어서 반환해준다.
  }
}
console.log(solution(arr)); // [5,4,3,2]
console.log(solution(arr2)); // -1

테스트 결과는 제대로 나오는데, 채점 시 0점이 나온다..

이유는 즉슨 배열의 순서가 중요한 자료일 경우도 있기 때문에

배열의 순서를 바꿔서는 안 된다고 한다.

 

그러면 진작에 제한사항에 알려주면 되는 거 아닌가 싶기도 하다.

 

그래서 다른 분들의 풀이를 참고해봤다.

 

참고 풀이 결과

let arr = [4, 3, 2, 1, 5];
let arr2 = [10];
function solution(arr) {
  arr.splice(arr.indexOf(Math.min(...arr)), 1);
  return arr.length ? arr : [-1];
}
console.log(solution(arr)); // [4,3,2,5]
console.log(solution(arr2)); // [-1]

다른 분이 풀이한 것을 참고하였다. 정상적으로 채점되었다.

사용된 메서드는 splice, indexOf, Math.min, 스프레드 문법(...), 삼항 조건식이다.

위 코드가 작동하는 순서를 나열해보자, 안쪽부터 보면 좀 더 편하다.

 

1. 스프레드 문법으로 arr배열을 복사하여 Math.min 요소로 넣어, 배열중에 최솟값을 찾아낸다.

   return 1

 

2. indexOf에서 1을 받아 호출된다. indexOf는 배열에서 지정된 요소의 첫 번째로 발견되는 인덱스 번호를 반환해준다.

   return 3 

 

3. splice는 첫 번째 인자로 삭제를 시작할 인덱스 번호를 받고, 두 번째 인자는 시작점부터 몇 개를 삭제할지 받는다.

   3과 1을 넣어 호출했기 때문에 3번째 요소에서 1개를 삭제한다,

   여기서 배열에 들어있는 1이 삭제되었다.

 

4. 삼항 조건 연산자에서 배열의 길이가 0일 경우(false)  [-1]을 반환하고,

   그 외에는 위에서 가공한 arr 배열을 반환해준다.

 

 

후기

내가 처음 시도한 방법은 배열을 정렬하고, 자르고, 뒤집고 난리도 아니었지만,

배열의 순서를 보존하며 가공하는 방식도 있음을 알았다.