빈도수 세기 패턴
일반적인 문제 해결 패턴을 습득하자
빈도수 세기 패턴(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)
빈도 카운터의 개념은 보통
객체를 사용
두 개의 배열을 객체로 세분화하여 각 배열의 요소들을 분류한 다음 각 배열을 비교
Last updated