문제
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
- 제한 조건
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
나의 풀이
첫번째 풀이
정렬 후,
arr[0]
값을 삭제하는 방식
function solution(arr) { // return 제일작은수 삭제한 배열 // 빈 배열 => return -1 let result = arr.slice(0); // arr = arr.filter((정렬->가장작은값)아닌 요소) result = result.filter(i => i !== arr.sort((a,b) => a - b)[0]); // if (arr.length === 0) return [-1]; if (result.length === 0) return [-1]; // else return arr; return result; }
처음에는let result = arr
로 썼었는데,arr.sort()
를 하자 result도 함께 변경되었다.
배열은 참조형이기 때문에 변수가 값만 복사하는 것이 아니라, 메모리 주소를 참조하기 때문에 그렇다.
그래서arr.slice()
를 통해 새로운 변수를 만들어주고 진행했다.
정확도 테스트 결과
테스트 1을 시간초과로 통과하지 못했다.
정렬하는데 시간이 오래걸리는 것 같아, 정렬하지 않고 해결할 방법을 찾았다.
두 번째 풀이
Math.min()
을 통해 최솟값을 구하는 방법
function solution(arr) { // return 제일작은수 삭제한 배열 // 빈 배열 => return -1 // 최소값 = Math.min(arr요소) // return arr.filter(최소값 아닌 수) arr = arr.filter(e => e !== Math.min.apply(...arr)); return arr.length === 0 ? [-1] : arr; }
여기서 유의할 점은Math.min(array)
로 쓰면 안된다는 것이다.
인수로 배열이 아닌 값들을 전달해야 하기 때문에, 배열을 인수로 해서 함수를 호출해주는apply()
를 사용해야 한다.
배열 요소 중 최댓값/최소값 구하기
- 최댓값 :
Math.max.apply(...array)
- 최소값 :
Math.min.apply(...array)
- 최댓값 :
정확도 테스트 결과
테스트 1번 시간이 오래 걸리긴 했지만, 통과했다.
다른 풀이
function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)),1);
if(arr.length<1)return[-1];
return arr;
}
센스있고 깔끔한 풀이arr.splice()
와 arr.indexOf()
를 적재적소에 사용했다.
splice를 이용해 최솟값의 인덱스를 삭제하고, arr를 아예 변형시켜 반환.
정확도 테스트 결과
시간도 엄청나게 절약된다
'Coding test' 카테고리의 다른 글
[프로그래머스] 하샤드 수 (Level 1) (0) | 2022.04.16 |
---|---|
[프로그래머스] 콜라츠 추측 (Level 1) (0) | 2022.04.16 |
[프로그래머스] 정수 제곱근 판별 (Level 1) (0) | 2022.04.15 |
[프로그래머스] 정수 내림차순으로 배치하기 (Level 1) (0) | 2022.04.15 |
[프로그래머스] 자연수 뒤집어 배열로 만들기 (Level 1) (0) | 2022.04.15 |