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라고 생각한다.