[33일차] Use Frequency Counter Pattern or Multiple Pointers Pattern 리뷰

저요·2022년 10월 25일

2022 100th day challenge

목록 보기
33/97

Use Frequency Counter Pattern or Multiple Pointers Pattern

https://velog.io/@eprnfmfmfm/25일차-Use-Frequency-Counter-Pattern-or-Multiple-Pointers-Pattern

서론

오늘은 25일차에 풀었던 알고리즘을 리뷰하도록 하겠다. 자세한 문제와 나의 해결책은 위의 링크를 통해 확인 할 수 있다. 위 문제는 가변인자를 받아 그 안에 중복된 것이 있는지 빈도카운트 패턴과 다중포인터 패턴 둘 중 하나를 이용해서 문제를 푸는 것이었다. 다시 한 번 문제의 해결책을 돌아보고, 내 해결책과 해답이 어떤 차이가 있는지를 비교하고 과연 어떤 방법이 효율적인지를 한 번 판단해 보려고 한다.

본론

Frequency Counter Pattern 을 이용한 해결책

빈도 카운터를 이용한 해결책에서는 둘 다 객체를 이용해서 빈도수를 세었다는 점은 같았다.
빈도 카운터를 이용해서 문제를 풀 경우 핵심 키워드는 Object의 사용 이었을 것이다.
나는 이렇게 한 번의 for루프를 이용해 객체안에 값을 넣으며 중복값을 체크했다.

 //객체 안에 존재하면 return true 존재하지 않으면 1을 세팅
    for(let i = 0; i <args.length; i++){
        if(lookup[args[i]]){
            return true;
        }else{
            lookup[args[i]] = 1
        }
    }

값을 넣기 전에 안에 존재 하는지를 체크한 뒤에, 내부에 중복값이 하나라도 존재한다면 바로 true를 반환하도록 말이다.

문제의 해답으로 내놓은 해결책에서는 두개의 for루프를 이용해서 문제를 해결했다. 첫번째 for루프에서는 가변인자를 key값으로, value값을 그 갯수로 세팅을 했고, 두번째 for 루프에서는 객체의 값을 비교해 1이상인 것이 있다면 true를 반환하도록 설계했다.

둘 중 어느것이 효율적인 방법이었을까는 단언하기 어렵다. 역시 for루프를 한 번만 사용하는 편이 성능면에서는 좀 더 나아보이지만, 또 해결책의 코드가 훨씬 깔끔하고 가변인자를 받아 객체 데이터를 온전히 만든 뒤에 비교를 하기 때문에 유지보수나 코드 재사용면에서는 훨씬 더 많은 장점을 가지고 있다고 생각한다.

Multiple Pointers Pattern 을 이용한 해결책

다중포인터 패턴은 정렬된 배열에서만 사용이 가능하다. 그래서 맨 첫줄에 정렬하는 로직을 적어넣었다. 정렬 로직은 해답 쪽이 화살표함수를 이용해 더 간결하게 표현했다.

args.sort((a,b) => a > b);

그 외의 접근 방식은 둘 다 똑같다. 포인터를 미리 정해두고 두번째 포인터가 끝에 닿을때까지 왼쪽에서 오른쪽으로 한칸씩 이동하며 값이 동일한지를 비교한다. 단지 다른점은 해답에서는 while 루프를 사용하여 좀 더 간결하게 코드를 작성했다는 것이다.

Set을 사용한 접근법

마지막으로 한 줄 솔루션이 첨부되어있는데 여기서는 자바스크립트의 Set을 이용하여 문제를 해결했다.
Set객체는 자료형과 상관없이 유니크한 요소만을 저장하는 객체이다.
따라서, 받은 가변인자를 중복을 허용하지 않는 Set객체에 저장한 뒤, Set객체의 길이와 가변인자를 받은 arguments의 길이를 비교하면 안에 중복이 있었는지를 알 수 있다.

function areThereDuplicates() {
	return new Set(arguments).size !== arguments.length;
}

참고

https://www.udemy.com/share/105zfq3@uu_BLCGjgZ6lEvDNFPo1Bi6_H9oc8-BGjIdhwcXZxT-Saf6yg6s8YYGfgs1QtXxv-w==/

profile
웹개발

0개의 댓글