[32일차] Frequency Counter 리뷰

저요·2022년 10월 24일

2022 100th day challenge

목록 보기
32/97

Frequency Counter 복습

https://velog.io/@eprnfmfmfm/24일차-Frequency-Counter-복습

서론

오늘부터는 내가 풀었던 알고리즘과 해답을 비교하면서 피드백을 하는 고드리뷰 시간을 가지려고 한다. 해당 문제와 기존의 해결법은 위의 링크에서 확인할 수 있다.

본론

문제에서 요구했던 것들

두 숫자열이 주어졌을 때 두 숫자열을 구성하는 숫자들이 같은지를 구별해내는 sameFrequency를 구현하는 문제로, Frequency Counter 패턴을 이용해 O(n)의 시간복잡도를 충족해야 함을 문제에서는 요구했다.

나의 접근법

나는 받은 숫자열을 그대로 사용하는 방법을 택했다.
두 숫자를 비교하기 위해서는 배열로 만들 필요가 있다고 생각했다.
때문에 다음처럼 받은 숫자를 10으로 나누어 그 나머지를 이용해 숫자를 배열의 형태로 만들었다.

//숫자열 1를 배열로 생성하기
    let arr1 = [];
    
    while(first > 0){
        arr1.push(Math.floor(first % 10));
        first = Math.floor(first / 10);
    }
    
    //숫자열 2를 배열로 생성하기
    let arr2 = [];
    
    while(second > 0){
        arr2.push(Math.floor(second % 10));
        second = Math.floor(second / 10);
    }

그리고 나서 자릿수를 비교해 서로 자릿수가 다른 것을 false로 반환했고,

if(arr1.length !== arr2.length) return false;

마지막으로 각자의 배열을 정렬하고 순서대로 비교하여 일치하는지를 확인했다.

arr1 = arr1.sort();
arr2 = arr2.sort();

console.log("check " + arr1 + " ||||| " + arr2);

for(let i = 0; i<arr1.length; i++){
	if(arr1[i] !== arr2[i]){
    	return false;
    }
}

해답과의 차이점

해답에서는 받은 숫자를 바로 toString을 이용해 문자로 치환해 이용하였다. 내가 위에서 숫자로 나누어 배열을 생성하는 과정을 스킵 하여 코드 길이를 많이 줄일 수 있었다.

let strNum1 = num1.toString();
let strNum2 = num2.toString();

또한 이렇게 String 타입으로 바꾸는 것으로 자릿수 비교를 바로 시행할 수 있었다.
해답에서는 객체를 2개 생성하여 숫자를 key값으로 숫자의 갯수를 value값으로 일치하면 +1을 하며 세었다.
그리고 마지막으로 객체를 for 루프를 이용해 같은 key값에 같은 value를 가지고 있는지 비교하는 것으로 두 숫자열이 같은 숫자로 구성되어 있는지를 구별 하는 로직을 만들어 냈다.

for(let key in countNum1){
    if(countNum1[key] !== countNum2[key]) return false;
}

숫자를 10으로 나눈 나머지로 배열을 만드는 나의 방법도 꽤나 기발했다고 생각했지만, 해답에서 사용한 것과 같이 문자열의 속성과 Object를 잘 이용했다면 코드를 좀 더 효율적이며 간결하게 짤 수 있었을 거다. 후반부에 다시 배열을 순서대로 정렬하고 비교하는 과정을 생략할 수 있을 거 같다는 생각이 든다.
따라서, 이 문제의 중요 키워드는 Object라고 생각한다.

참고

https://www.udemy.com/share/105zfq3@kM6Q_nfa2t7ROSH3sS7WTCS_a2BeLRZ0yfBZfkXWH2bwEkM27kG9hwTHqEsLcmUvfg==/

profile
웹개발

0개의 댓글