같은 숫자는 싫어 [자바스크립트]

배열에서 동일한 숫자가 연속적으로 반복할 때, 한 개만 남기고 나머지는 삭제하는 방법에 대해 정리하겠습니다.

[1,1,3,3,0,1,1] => [1,3,0,1]을 출력 [4,4,4,3,3] => [4,3]을 출력

위의 문제는 filter method를 사용해 조건에 부합하는 요소만 취해 새로운 배열을 반환하게 하면 쉽게 풀 수 있습니다.

function solution(arr) {
  return arr.filter(function(cur, idx) {
    return cur !== arr[idx + 1];
  });
}

배열의 각 요소와 그 다음 요소를 비교해, 값이 같으면 넘어가고(false) 다르면 true를 리턴에 배열에 추가합니다. filter method가 배열의 마지막 요소에 호출될 때 배열의 마지막 요소와 배열에 없는 요소(undefined)를 비교하게 됩니다. boolean값이 false를 반환하기 때문에 배열의 마지막 요소는 새 배열에 추가가 됩니다.

음..뭔가 마치기 아쉬워 for loop으로 풀어보았습니다. 로직은 위와 동일합니다. 위의 filter를 사용한 것보다는 코드 속도가 더 빨랐습니다.

function solution(arr) {
  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[i + 1]) {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}

아직 잠이 오지 않아 reduce method로도 왠지 가능할 것 같아서 동일한 문제를 풀어보았습니다. 가능은 했지만 코드가 장황해지고 코드 속도도 느려져 이 문제 풀이에는 적합하지 않은 것 같습니다.

function solution(arr) {
  var result = [];

  arr.reduce(function(acc, cur) {
    if (acc === cur) {
      return cur;
    } else if (acc !== cur) {
      result.push(acc);
      return cur;
    }
  });

  result.push(arr.slice(-1)[0]);

  return result;
}