알고리즘 - freeCodeCamp - dropElements

NO PAIN, NO GAIN·2019년 12월 8일
0

algorithm

목록 보기
13/18

문제

배열을 반복문을 이용해서 콜백이 true를 반환하면 true를 반환하는 부분부터 배열을 반환하시오.

예시

  • dropElements([0, 1, 0, 1], function(n) {return n === 1;}) --> [1, 0, 1]
  • dropElements([1, 2, 3, 9, 2], function(n) {return n > 2;}) --> [3, 9, 2]

풀이

function dropElements(arr, func) {
  // Drop them elements.
  for (let i = 0; i < arr.length; i++){
    if (func(arr[i])) { // 가.
      return arr.slice(i); // 나.
    }
  }
  return []; // 다.
}

가. functrue를 반환하면
나. true를 반환한 i번째 부터 마지막까지 배열을 잘라서 반환
다. 조건에 만족하지 않다면 []를 반환

하면서...

풀이 과정에서 slice대신 splice를 사용했다. splice를 사용했을 때 조건이 false일 때 값을 하나씩 제거했다. 그 결과 배열이 하나씩 앞으로 당겨지면서 바로 다음 배열로 가는게 아니라 하나 건너띄어서 값을 탐색된다. 고민하다가 떠오른게 slice였다. i 번째가 조건이 맞으면 i번째 포함해서 배열을 반환했다.
위의 글을 작성하면서 splice로 해결할 수 있는 방법을 생각했다. i값을 변화시키지 않고, funcfalse를 반환하면 splice의 의해서 제거가 되니깐 한칸씩 앞으로 오게 되고 true가 나올 때까지 앞으로 당겨진다. true이면 나머지를 반환한다.

function dropElements(arr, func) {
  // Drop them elements.
  for (let i = 0; i < arr.length;){
    if (!func(arr[i])) {
      arr.splice(i, 1);
    } else {
      return arr;
    }
  }
  return [];
}

이 방법이 지어진 함수명(dropElements)과 가깝다고 생각된다.

profile
갈고 닦자.

0개의 댓글