티스토리 뷰
오늘은 학교 수업 때문에 코테 문제 하나밖에 못 풀었네요...
오늘의 코테 문제는 '제일 작은 수 제거하기'입니다.
정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를 들어 arr이 [4, 3, 2, 1]인 경우는 [4, 3, 2]를 리턴하고, [-10]이면 [-1]을 리턴합니다. (단, arr은 길이 1 이상인 배열입니다.)
function solution(arr) {
var answer = [];
arr.sort((a, b) => b - a).pop();
arr.length === 0 && arr.push(-1);
answer = arr;
return answer;
}
처음에는 입력 예시로 [4, 3, 2, 1] 이렇게 되어 있어서 내림차순으로 정렬한 후 마지막 요소 제거하면 되겠구나...! 라고 생각하고 돌렸는데 전부다 실패로 나왔습니다... 이유를 생각해보니까 배열을 내림차순으로 정리하면서 배열의 순서가 뒤틀려서 그랬습니다... Math.min을 통해 가장 작은 수를 구하고 filter를 통해 가장 작은 수를 제거하면 되는 문제였는데 괜히 더 복잡하게 생각했네요.
answer = arr.filter((a) => a !== Math.min(arr));
이렇게 하니까 Math.min 값이 NaN이 나와서 결과값이 제대로 안 나옵니다. 이유를 찾아보니 배열은 스프레드 연산자인 ...을 사용하여 숫자 목록을 펼쳐 사용해야 했습니다.
전개 구문 - JavaScript | MDN
전개 구문을 사용하면 배열이나 문자열과 같이 반복 가능한 문자를 0개 이상의 인수 (함수로 호출할 경우) 또는 요소 (배열 리터럴의 경우)로 확장하여, 0개 이상의 키-값의 쌍으로 객체로 확장시
developer.mozilla.org
이렇게 가장 작은 수를 제거한 후 배열의 길이가 0인 경우에 -1을 요소에 집어놓도록 해서 풀었습니다.
function solution(arr) {
var answer = [];
answer = arr.filter((a) => a !== Math.min(...arr));
answer.length === 0 && answer.push(-1);
return answer;
}
첫번째 테스트 시간이 너무 많이 걸려 다른 사람의 풀이도 보았습니다.
function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)),1);
if(arr.length<1)return[-1];
return arr;
}
다른 부분은 filter와 splice의 차이인데 filter는 새로운 배열을 생성하고 splice는 기존 배열에서 직접 값을 제거한 후 새로운 배열을 생성하지 않기 때문에 시간과 메모리 효율성에서 더 유리하다고 합니다!