filter로 코드 간단히

김민주·2022년 8월 23일
0

같은 숫자는 싫어! 알고리즘 풀이

내 코드

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라는 스택 저장 공간을 만들어놓고, 차례대로 순환하면서 값을 비교해서 푸는 방법으로 풀었다.

  1. 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를 파라미터로 작성해주는 것 같다.

이렇게 알고리즘에서도 코드의 유지보수성에 대해 알아간다.

profile
성공은 퍼포먼스가 아니라 지속성이다. 언제 이루어지는지가 아니라, 어떤 모양으로 이루는지가 더 중요하다.

0개의 댓글

관련 채용 정보