빈도수 세기 패턴(Frequency Counters)
// 예시
// 첫번째 배열과 두번째 배열이 제공되고,
// 두번째 배열에는 첫번째 배열의 값의 제곱수들이 존재하는지 확인하기.
same([1,2,3], [4,1,9]) // true
same([1,2,3], [1,9]) // false
same([1,2,1], [4,4,1]) // false
// 순진한 접근법
function same(arr1, arr2) {
if(arr.length !== arr2.length) {
return false
}
for(let i = 0; i < arr1.length; i++) {
let correctIndex = arr2.indexOf(arr[1] ** 2)
if(correctIndex === -1) {
return false
}
arr2.splice(correctIndex, 1)
}
return true
}
[1,2,3], [9,1,4,4] // false
[1,2,3,2],[9,1,4,4] // true
// BigO - O(n^2)
// 빈도 카운터 패턴
// Refactoring
function same(arr1, arr2) {
if(arr1.length !== arr2.length) {
return false
}
let frequencyCounter1 = {}
let frequencyCounter2 = {}
for (let val of arr1) {
frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1
}
for (let val of arr2) {
frequencyCounter2[val] = (frequencyCounter1[val] || 0) + 1
}
for(let key in frequencyCounter1) {
if(!(key ** 2 in frequencyCounter2)){
return false
}
if(frequencyCounter2[key ** 2] !== frequencyCounter1[key]){
return false
}
}
return true
}
// BigO - O(n)
빈도 카운터의 개념은 보통 객체를 사용
두 개의 배열을 객체로 세분화하여 각 배열의 요소들을 분류한 다음 각 배열을 비교