August 27th 2018
배열에서 동일한 숫자가 연속적으로 반복할 때, 한 개만 남기고 나머지는 삭제하는 방법에 대해 정리하겠습니다.
[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;
}