Anagrams

Directions

나열된 두 개의 문자열이 'anagram'인지 확인하기. 'anagram'은 하나의 문자열과 동일한 문자를 사용하는 경우를 말한다. 사용되어진 문자의 갯수도 같아야 한다. 공백이나 기호가 아닌 문자만 관여 되어진다. 대문자는 소문자와 동일하게 간주한다.

Examples

  anagrams('rail safety', 'fairy tales') --> True
  anagrams('RAIL! SAFETY!', 'fairy tales') --> True
  anagrams('Hi there', 'Bye there') --> False

TIP

const word = 'HI THERE!!!!!'
word.replace(/[^\w]/g, '') // HITHERE
word.replace(/[^\w]/g, '').toLowerCase() // hithere

const obj = {
  a: 1,
  b: 1,
  c: 1
}

Object.keys(obj).length // 3

1.

Anagrams_1Anagrams_2

function anagrams(stringA, stringB) {
  const aCharMap = buildCharMap(stringA)
  const bCharMap = buildCharMap(stringB)

  // stringA의 문자 갯수와 stringB의 문자 갯수가 다를경우 (상단 erMind참고, hello !== hellos)
  if (Object.keys(aCharMap).length !== Object.keys(bCharMap).length) {
    return false
  }
  // 두 문자열이 서로 다른 문자로 구성되어 있을경우
  for (let char in aCharMap) {
    if (aCharMap[char] !== bCharMap[char]) {
      return false
    }
  }

  return true
}

function buildCharMap(str) {
  const charMap = {}

  // 문자만 골라내어서 소문자로 만들기
  for (let char of str.replace(/[^\w]/g, '').toLowerCase()) {
    charMap[char] = charMap[char] + 1 || 1
  }
  return charMap
}
module.exports = anagrams

TIP

for ... of: 'object' 일 경우

for ... in: 'array' 일 경우

2.

TIP

const numbers = [10, 30, 5, -90, 10000]

numbers.sort() // [-90,10,10000,30,5]

const alphabet = ['z', 'd', 'b', 'x', 'r']

alphabet.sort() // ["b", "d", "r", "x", "z"]

const str = 'Hello There!'
const str2 = 'There Hello!'

str
  .replace(/[^\w]/g, '')
  .toLowerCase()
  .split('')
  .sort()
  .join('') // eeehhllort

str2
  .replace(/[^\w]/g, '')
  .toLowerCase()
  .split('')
  .sort()
  .join('') // eeehhllort
function anagrams(stringA, stringB) {
  cleanString(stringA) === cleanString(stringB)
}

function cleanString(str) {
  return str
    .replace(/[^\w]/g, '') // 문자만 나오도록
    .toLowerCase() // 소문자로 변경
    .split('') // 문자로 나누기
    .sort() // 문자 정렬
    .join('') // 문자열로 합치기
}
module.exports = anagrams

Test

const anagrams = require('./index.js')

test('anagrams function exists', () => {
  expect(typeof anagrams).toEqual('function')
})

test('"hello" is an anagram of "llohe"', () => {
  expect(anagrams('hello', 'llohe')).toBeTruthy()
})

test('"Whoa! Hi!" is an anagram of "Hi! Whoa!"', () => {
  expect(anagrams('Whoa! Hi!', 'Hi! Whoa!')).toBeTruthy()
})

test('"One One" is not an anagram of "Two two two"', () => {
  expect(anagrams('One One', 'Two two two')).toBeFalsy()
})

test('"One one" is not an anagram of "One one c"', () => {
  expect(anagrams('One one', 'One one c')).toBeFalsy()
})

test('"A tree, a life, a bench" is not an anagram of "A tree, a fence, a yard"', () => {
  expect(
    anagrams('A tree, a life, a bench', 'A tree, a fence, a yard')
  ).toBeFalsy()
})