본문 바로가기

알고리즘

빈도수 세기

문제


빈도수 세기- validAnagram

두 개의 문자열이 주어졌을 때, 두 번째 문자열이 첫 번째 문자열의 애너그램인지 확인하는 함수를 작성합니다. 애너그램은 다른 글자의 글자를 재배열하여 형성된 단어, 구 또는 이름입니다. (예시: cinema -> iceman)

예시:

validAnagram('', '') // true
validAnagram('aaz', 'zza') // false
validAnagram('anagram', 'nagaram') // true
validAnagram("rat","car") // false) // false
validAnagram('awesome', 'awesom') // false
validAnagram('amanaplanacanalpanama', 'acanalmanplanpamana') // false
validAnagram('qwerty', 'qeywrt') // true
validAnagram('texttwisttime', 'timetwisttext') // true
 

안내: 문자열에 소문자만 포함되어 있다고 가정해도 됩니다.

Time Complexity - O(n)

 

 

분석

Q) 두 단어의 구성 요소가 동일한가?

input) string, string

output) boolean

 

 

답안

function validAnagram(word1, word2){
  // 길이가 다르면 false 리턴한다.
  if (word1.length != word2.length) {
      return false
  }
  
  // 객체를 만들어 word1의 구성요소를 카운트한다.
  const word1Map = countMap(word1)
  // 객체를 만들어 word2의 구성요소를 카운트한다.
  const word2Map = countMap(word2)
  
  // word1의 객체를 순회하면서, word2의 객체와 대응되는 값을 비교한다.
  for (let [letter, count] of Object.entries(word1Map)){
    // 일치하지 않으면 false 리턴.
    if (word2Map[letter] != count) {
        return false
    }
  }
    
  // true 리턴.
  return true
}

function countMap(word){
  const wordMap = {}
  
  for (let letter of word){
      wordMap[letter] = ++wordMap[letter] || 1
  }
  
  return wordMap
}

'알고리즘' 카테고리의 다른 글

다중 포인터  (0) 2024.07.15
[자료구조] 배열  (0) 2023.07.03