jinmayamashita
9/23/2015 - 2:58 PM

is-anagram.js

/**
 * @name is-anagram.js - 아나그램을 판단하는 로직
 * 
 * @author Jinma Yamashita jinma.hands@gmail.com
 * @version v0.01
 * @update: 2015-09-23
 */
(function () {
    
  /**
   * @function init - 비교할 대상을 지정하는 기능
   */
  function init() {
    btn.addEventListener('click', function () {
      var btn = document.getElementById('btn');
      var str1 = document.getElementById('str1').value;
      var str2 = document.getElementById('str2').value;

      var res = compare(str1, str2);
      var result = document.getElementById('result');
      
      if (res) {
          result.innerHTML = 'A valid anagram!';
      } else {
          result.innerHTML = 'Not a valid anagram.';
      }
    });
  }

  /**
   * @function intoMix - 비교할 스트링을 하나의 배열로 만드는 기능
   *
   * @param  {string} str1 - 첫번째 문자열
   * @param  {string} str2 - 두번째 문자열
   * @return {array} arr - 첫번째와 두번째 문자열을 넣은 배열
   */
  function intoMix(str1, str2) {
    var arr = [];
    for (var item in str1) {
      arr.push(str1[item]);
      arr.push(str2[item]);
    }
    return arr;
  }

  /**
   * @function isEven - 짝수인지 홀수인지 확인하는 기능
   * 
   * @param  {number}  n - 배열의 갯수
   * @return {boolean}
   */
  function isEven(n) {
    if (n % 2 === 0) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * @function compare - 아나그램을 판단하는 기능
   * 
   * @param  {string} str1 - 첫번째 문자열
   * @param  {string} str2 - 두번째 문자열
   * @return {boolean}
   */
  function compare(str1, str2) {

    if (str1.length !== str2.length) {
        return false;
    }
    
    // 결과를 담는 변수
    var result = true;

    var mixedArr = intoMix(str1, str2);
    var i = 0;

    mixedArr.forEach(function () {
      var indices = [];
      var idx = mixedArr.indexOf(mixedArr[i]);

      while (idx != -1) {
        indices.push(idx);
        idx = mixedArr.indexOf(mixedArr[i], idx + 1);
      }

      // 배열에 홀수로 담겨있는 문자가 있으면 아나그램이 아니다.
      if (!isEven(indices.length)) {
        result = false;
      }
      i++;
      
      return true;
    });
    return result;
  }
  init();
})();