아나그램

이효범·2022년 4월 12일
0

알고리즘

목록 보기
4/12
post-thumbnail

두 개의 문자열이 주어지며 두 개의 문자열에 포함된 문자가 나타나는 횟수가 서로 같은 지 비교하여 같다면 참을 리턴하고 다르다면 거짓을 리턴하는 함수를 구현하는 문제다.

예시는 다음과 같다.

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

문자가 그 안에 있는 경우뿐만 아니라 안에 있는 문자들이 나타나는 정확한 횟수, 그리고 빈도가 정확한지를 확인해야 하는 문제다.

예를 들어 빈 문자열과 빈 문자열을 입력하면 참이 반환되어야 한다.
또한 'anagram' 과 'nagaram' 을 입력해도 빈도수가 정확하게 같기 때문에 참을 반환해야 한다.

참고로 공백과 마침표, 구두점, 숫자는 고려하지 않는다. 또한 대문자도 고려하지 않는다.


소스 코드

function validAnagram(first, second) {
 if (first.length !== second.length) {
   // 문자열의 길이가 서로 다르면 참이 될 수 없다.
  return false; 
 }
  
  const lookup = {};
  
  for (let i = 0; i < first.length; i++) {
   let letter = first[i];
    // 만약 letter가 존재한다면, 1 증가시키고 존재하지 않는다면 1로 초기화해준다.
    lookup[letter] ? lookup[letter] += 1 : lookup[letter] = 1;
  }
  console.log(lookup);  // {a: 3, n: 1, g: 1, r: 1, m: 1}
  
  // lookup을 구성했으니 이제 실제로 사용해보자
  // 즉 두 번째 문자열에 루프를 적용하여 첫 번째 문자열을 기반으로 만든 lookup 객체와 비교해보자
  for (let i = 0; i < second.length; i++) {
   let letter = second[i];
    // 만약 letter가 없거나 letter가 0이라면, 아나그램 조건에 충족하지 않으므로 false를 리턴한다.
    if (!lookup[letter]) {
     return false; 
    } else {
      // 존재한다면 대응하는 값에 1을 빼준다. 만약 두 문자열이 서로 일치하는 아나그램이라면, 객체 lookup은 모든 키에 대한 값이 0으로 설정되어야 한다.
     lookup[letter] -= 1; 
    }
  }
  console.log(lookup);  // {a: 0, n: 0, g: 0, r: 0, m: 0}
  
  return true;
}

validAnagram("anagram", "nagaram");  // true
profile
I'm on Wave, I'm on the Vibe.

0개의 댓글