문제
나의 풀이
첫번째 시도
function solution(arr) {
return arr.length !== 0
? arr[0] !== 10
? arr
.sort(function (a, b) {
return b - a;
})
.slice(0, -1)
: [-1]
: -1;
}
코드실행은 성공! 그러나 제출 후 채점하기에서 런타임오류.
왜? 분명히 제대로 잘 작성한 것 같은데 이해가 가지않아서 5분간 계속 생각만 했던 것 같다.
찰나에 깨달은 내용.
아~ 문제에서는 정렬하라는 소리는 없었구나. 내가 마음대로 정렬해서 마지막 숫자를 빼려고 했어서 생긴거구나
그리하여 코드를 다시 작성하게 되었다.
두번째 코드
function solution(arr) {
let array = [...arr];
array.length !== 0 //1번
? array[0] !== 10 //2번
? array.splice(array.indexOf(Math.min.apply(null, array)), 1) //3번
: array.splice(0, 1, -1) //4번
: (array += -1); //5번
return array;
}
KEY POINT : splice(), apply(), Math.min()
splice()메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다.
apply()메서드는 배열을 호출한다.
apply(null, array) : null은 strict모드를 사용하지 않을때 오류를 방지하고자 apply함수에 첫번째인자로 들어가야한다.
Math.min에 apply를 사용한 이유 : Math.min은 배열을 호출 않아서 apply메서드를 이용하여 배열을 호출한다.
1. array변수에 arr배열 내용을 깊은복사 한다.
2. array.length가 0이 아닐때(빈배열이 아닐때) 0이 아니면 다음으로 이동 // 1번
> 배열의 첫번째 내용이 10인가?([10]방지) 10이 아니면 다음으로 이동 // 2번
> 그 배열의 최소값을 구하여(Math.min.apply())
array의 인덱스를 구한다(array.indexOf()).
그리고 그 인덱스를 날린다(slice(index, 1)). // 3번
2-1. 2번에서 10이 맞을때, 배열의 첫번째 요소를 -1로 바꾼다. ([-1], 배열에 -1이 담기게하기위하여) // 4번
2.2. 1번에서 빈배열이 맞을 때, array변수에 -1 넣음 (숫자만 -1 넣기 위하여) // 5번
음.. 이게 왜 11점이나 받았는지는 모르겠지만 재밌게 잘 풀었다.
뭔가 코딩 논리를 짤때는 고등학생 때 영어 문법해독하려고 공부하는 느낌이랑 비슷한 것 같은 느낌은 나만 받는 건가? 싶다...
다른 사람 풀이방식
function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)),1);
if(arr.length<1)return[-1];
return arr;
}
키 포인트는 글쓴이와 비슷한 것 같다. 쓴 메소드는 같지만 훨씬 단축 시켜놓은 코드이다. 확실히 보기 편하고 좋은 코드가 확실하다.
최소값을 구하여 splice를사용하여 처음에 받았던 원본배열 arr을 건들여서 최소값을 빼고, 빈배열일경우 -1을 리턴 시키게 했다.
'코딩테스트 입문' 카테고리의 다른 글
하샤드 수 (0) | 2022.11.21 |
---|---|
콜라츠 추측 (0) | 2022.11.21 |
정수 제곱근 판별 (0) | 2022.11.21 |
정수 내림차순으로 배치하기 (0) | 2022.11.21 |
자연수 뒤집어 배열로 만들기 (0) | 2022.11.21 |