프로그래머스 - 제일 작은 수 제거하기
· 약 3분
목적
Algorithm 문제풀이 과정을 기록하고, 나만의 해결방법을 공유합니다.
- 문제 링크와 문제
- 풀이 전 계획과 생각 (수도 코드)
- 풀이 (코드 블록 첨부)
- 풀이하면서 막혔던 점과 고민
- 풀이 후 알게된 개념과 소감
문제 링크
문제
정수를 저장한 배열, 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] |
풀이 전 계획 (수도 코드)
- 우선 배열을 내림차순으로 정렬 후
pop()메서드로 맨뒤에 있는 가장 작은 수를 빼면 간단할 듯 하다. - 위 방법이 해결되지 않는 경우 배열을 탐색하며 최솟값을 찾아야 한다.
풀이
1. 정렬 sort() 메서드 사용하여 풀이
solution.js
function solution(arr) {
if (arr.length <= 1) return [-1];
arr.sort((a, b) => b - a);
arr.pop();
return arr;
}
실행 결과
# 테스트 케이스
테스트 1 〉 입력값 [4, 3, 2, 1] / 기댓값 [4, 3, 2] → 통과
테스트 2 〉 입력값 [10] / 기댓값 [-1] → 통과
# 제출
테스트 1 ~ 11 〉 실패
위처럼 테스트 케이스는 통과했으나, 문제 제출에서 전부 통과하지 못했다.
원인은 테스트 케이스는 정렬이 되어있는 케이스였지만.. 정렬이 아닌 케이스는 순서가 바뀌는 것 이기 때문에 정렬을 하면 안됐다...
2. 최솟값을 찾아 splice()로 제거
solution.js
function solution(arr) {
// 배열의 길이가 1이하인 경우 예외처리
if (arr.length <= 1) return [-1];
// 최솟값 구하기
let min = arr[0];
for (let i = 1; i <= arr.length; i++) {
if (min > arr[i]) min = arr[i];
}
// 최솟값의 index 구해서 splice로 제거하기
let idx = arr.indexOf(min);
arr.splice(idx, 1);
return arr;
}
실행 결과
테스트 1 〉 통과 (2.03ms, 42.6MB)
테스트 2 〉 통과 (0.12ms, 33.5MB)
테스트 3 〉 통과 (0.17ms, 33.6MB)
테스트 4 〉 통과 (0.13ms, 33.5MB)
테스트 5 〉 통과 (0.13ms, 33.5MB)
테스트 6 〉 통과 (0.15ms, 33.6MB)
테스트 7 〉 통과 (0.24ms, 33.5MB)
풀이하며 막혔던 점과 고민
Math.min으로 손쉽게 최솟값을 구할 수 있다고 생각했다. 하지만 배열이 들어가니 에러가 났고, 하나씩 넣고자 for문을 사용했지만 NaN이 나왔다...
분명 손쉽게 푸는 방법이 있을 것 이라는 생각이 들었다.
풀이 후 알게된 개념과 소감
다른 사람의 풀이 중, 내가 생각했던 방법이다.
function solution(arr) {
const min = Math.min(...arr);
return arr.length !== 1 ? arr.filter((i) => i !== min) : [-1];
}
Math.min을 사용할 때 인수로 항상 숫자가 들어가야 하기 때문에 spread 연산자(...arr) 로 배열을 깨서 1, 2, 3, 4 로 들어가야한다...
조금만 더 생각해보면 좋았을 텐데. 아쉬웠다. 그리고 return을 삼항연산자를 활용 했는데 조금 가독성이 떨어져 보인다. 하지만 filter 로 min을 걸러낸 것도 좋은 아이디어였다.
최종 정리
Math.min()의 인자로는 배열이 들어갈 수 없고, 배열이라면 전개 연산자(spread)로 넣어주면 활용 가능하다.- return문에 삼항연산자를 길게 사용하는 것은 가독성을 해친다.
- 다른 사람의 풀이를 항상 보면서 더 좋은 방법에 대한 힌트를 얻고 내 코드와 비교해 보자.
