1. 문제 해결 패턴 소개
2. 빈도 수 세기 패턴 (Frequency Counter)
- 자바스크립트 객체 사용해 다양한 값과 빈도를 수집할 쓰이는 패턴
- 여러 데이터와 입력값이 서로 비슷한 값으로 구성되어 있는지 값이 다른 값에 포함되는지 여부를 비교할 때 등
예시 - 2개의 배열을 허용하는 same 함수 작성, 배열의 모든 값이 두 번째 배열에 해당하는 값을 가지면 true 반환
단순 접근법
function same(arr1, arr2){
let answer = false
if(arr1.length !== arr2.length) return answer
for(let i=0; i<arr2.length; i++){
if(arr1.some(el => el*el===arr2[i])) answer = true
else answer = false
}
return answer
}
same([1,2,3] , [4,1,9])
same([1,2,3] , [1,9])
same([1,2,1] , [4,1,1])
- 이러한 접근법은 O(N^2), 제곱시간이 사용되어 순진한 접근법으로 가능한 않는게 좋다
빈도 카운터 패턴 접근법
- loop를 두개로 나눠 중첩된 개별 루프가 아닌 선형시간인 O(N)으로 수정되도록 하기
function sameForFrequency(arr1, arr2){
let frequencyCounter1 ={}
let frequencyCounter2 ={}
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1
}
console.log(frequencyCounter1)
console.log(frequencyCounter2)
for(let key in frequencyCounter1){
console.log(key)
if(!(key ** 2 in frequencyCounter2)){
return false
}
}
return true
}
sameForFrequency([1,2,3,2,5],[9,1,4,4,25])