frequency count pattern

두개의 배열 a,b가 있다. b배열은 a배열들의 원소들의 제곱으로 이루어져 있어야 한다.
이 때 순서는 상관이 없다. 두 배열의 길이는 같다. 즉, 1:1 매칭되야 한다.

const arr = [1, 1, 2, 3, 4]
const arr2 = [1, 1, 4, 9, 16]

const frequencyCount = (a, b) => {
    const freqObjectA = {}
    const freqObjectB = {}
    for(const val of a) {
        freqObjectA[val] = (freqObjectA[val] || 0) + 1
    }

    for(const val of b) {
        freqObjectB[val] = (freqObjectB[val] || 0) + 1
    }

    console.log(freqObjectA) // {1: 2, 2: 1, 3: 1, 4: 1}
    console.log(freqObjectB) // {1: 2, 4: 1, 9: 1, 16: 1}

    // 배열을 객체로 바꿨으니 배열의 indexOf로 접근하며 찾는것보다 빨리 값에 접근할 수 있을것이다.
    for(const key in freqObjectA) {
        if(!(key ** 2 in freqObjectB)) return false
        if(freqObjectB[key ** 2] !== freqObjectA[key]) return false // 개수 또한 같아야 한다.
    }
    return true
}

frequencyCount(arr, arr2)

anagram

frequency pattern의 개념을 활용한 아나그램 풀이다. 함수의 인수값은 string이라고 가정, 2개의 입력을 허용한다.

const anagram = (a, b) => {
    if(a.length !== b.length) {
        return false
    }
    const anaObj = {}
    
    for(let i = 0; i < a.length; i++) {
        const word = a[i]
        anaObj[word] = (anaObj[word] || 0) + 1        
    }
    console.log(anaObj) //{a: 3, n: 1, g: 1, r: 1, m: 1}
    
    for(let i = 0; i < b.length; i++) {
        const word = b[i]
        if(!anaObj[word]) return false
        else anaObj[word] -= 1
    }

    return true
}

anagram('anagram', 'garaman') // true
anagram('anagram', 'garamaz') // false

js를 활용한 알고리즘 풀이를 조금씩 해 보려고 한다. 파이썬과는 안녕!

profile
그냥 개인적으로 공부한 글들에 불과

0개의 댓글