같은 숫자는 싫어! 알고리즘 풀이
내 코드
function solution(arr) {
const answer = [];
for (let i = 0; i < arr.length; i++) {
if (i === 0) {
answer.push(arr[0]);
continue;
}
if (arr[i] !== arr[i - 1]) {
answer.push(arr[i]);
}
}
return answer;
}
answer라는 스택 저장 공간을 만들어놓고, 차례대로 순환하면서 값을 비교해서 푸는 방법으로 풀었다.
continue
를 사용해서 if else
문을 탈피하는 방법으로 풀었다고 생각했다.위 코드도 테스트를 통과하긴 첫번째 if
문을 아예 없앨 수 있는 방법도 있다.
function solution(arr) {
const answer = [arr[0]];
for (let i = 1; i < arr.length; i++) {
const lastNumber = answer[answer.length - 1];
if (lastNumber !== arr[i]) {
answer.push(arr[i]);
}
}
return answer;
}
비교하는 두 값을 arr 내부에서 찾는 것에서부터, answer의 가장 마지막 요소와 arr의 요소를 비교하는 것으로 바꾸었다. 약간 시야를 아예 옮긴 느낌.
그리고 filter
메소드를 써서 완전 간결하게 만드는 방법도 있었다.
function solution(arr) {
return arr.filter((number, index) => number !== arr[index - 1]);
}
filter
메소드에는 첫번째 파라미터로 배열을 순환할 때 현재 바라보고 있을 값을 넣는다. 그리고 두번째 파라미터에는 index가 들어갈 수 있다.
이것은 사람들이 잘 모르는 속성이라 잘 알아두면 활용할 수 있을 것 같다. 그리고 세번째 파라미터도 있는데 이는 arr.filter에서 arr를 바라보고 있는 값이다. 그냥 필요할 때 바로 arr를 쓰면 되는데 왜 굳이 세번째 파라미터로 사용하냐? 하면은 코드의 유지보수 때문이라 생각한다.
예를 들어서, 위 코드의 가장 좋은 답변은 아래와 같을 것 같다.
function solution(arr) {
return arr.filter(isNotDuplicated);
}
function isNotDuplicated(number, index, array) {
return number !== array[index - 1];
}
mdn공식문서에 보면 filter메소드 예시를 작성할 때 로직을 담당하는 부분을 별도의 함수로 분리해놓은 경우를 많이 볼 수 있었다. 별도 함수로 분류해놓으면 순수함수의 특성을 생각했을 때 각 함수는 동일한 인자가 주어졌을 때 동일한 값을 리턴시켜야 하고, 각 함수는 자기가 어떤 일을 할 지 전혀 알 수가 없기 때문에 array를 파라미터로 작성해주는 것 같다.
이렇게 알고리즘에서도 코드의 유지보수성에 대해 알아간다.