문제

 

나의 풀이

첫번째 시도

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

+ Recent posts