[1차] 뉴스 클러스터링

2020.08.01

const convertToHash = (arr) => {
  const result = {};
  for (let i = 0; i < arr.length - 1; i++) {
    const letter = arr[i] + arr[i + 1];
    if (letter.match(/[a-z]{2}/)) {
      if (!result.hasOwnProperty(letter)) {
        result[letter] = 1;
      } else {
        result[letter]++;
      }
    }
  }
  return result;
};

const intersectionLength = (hash1, hash2) => {
  const result = [];
  for (const key in hash1) {
    if (hash2.hasOwnProperty(key)) {
      const limit = Math.min(hash1[key], hash2[key]);
      for (let i = 0; i < limit; i++) {
        result.push(key);
      }
    }
  }
  return result.length;
};

const unionLength = (hash1, hash2) => {
  const result = [];
  for (const key in hash1) {
    if (!hash2.hasOwnProperty(key)) {
      for (let i = 0; i < hash1[key]; i++) {
        result.push(key);
      }
    } else {
      const limit = Math.max(hash1[key], hash2[key]);
      for (let i = 0; i < limit; i++) {
        result.push(key);
      }
      delete hash2[key];
    }
  }
  for (const key in hash2) {
    for (let i = 0; i < hash2[key]; i++) {
      result.push(key);
    }
  }
  return result.length;
};

const solution = (str1, str2) => {
  const loweredStr1 = str1.toLowerCase();
  const loweredStr2 = str2.toLowerCase();
  const hashOfStr1 = convertToHash(loweredStr1);
  const hashOfStr2 = convertToHash(loweredStr2);
  if (
    Object.keys(hashOfStr1).length == 0 &&
    Object.keys(hashOfStr2).length == 0
  ) {
    return 65536;
  }
  const answer = Math.floor(
    (intersectionLength(hashOfStr1, hashOfStr2) /
      unionLength(hashOfStr1, hashOfStr2)) *
      65536
  );
  return answer;
};
  • 정규표현식을 공부하긴 해야되겠는게, 여기서 정규표현식을 안쓰면 배열 안에 a부터 z까지 일일이 하드코딩으로 담고 또 includes메소드로 찾아야 함

  • 별로 큰 변화는 아니지만 교집합과 합집합이 어차피 길이만 반환하기 때문에 아래와 같이 재구성해보았다.

const convertToHash = (arr) => {
  const result = {};
  for (let i = 0; i < arr.length - 1; i++) {
    const letter = arr[i] + arr[i + 1];
    if (letter.match(/[a-z]{2}/)) {
      if (!result.hasOwnProperty(letter)) {
        result[letter] = 1;
      } else {
        result[letter]++;
      }
    }
  }
  return result;
};

const intersectionLength = (hash1, hash2) => {
  let count = 0;
  for (const key in hash1) {
    if (hash2.hasOwnProperty(key)) {
      const limit = Math.min(hash1[key], hash2[key]);
      count += limit;
    }
  }
  return count;
};

const unionLength = (hash1, hash2) => {
  let count = 0;
  for (const key in hash1) {
    if (!hash2.hasOwnProperty(key)) {
      count += hash1[key];
    } else {
      const limit = Math.max(hash1[key], hash2[key]);
      count += limit;
      delete hash2[key];
    }
  }
  for (const key in hash2) {
    count += hash2[key];
  }
  return count;
};

const solution = (str1, str2) => {
  const loweredStr1 = str1.toLowerCase();
  const loweredStr2 = str2.toLowerCase();
  const hashOfStr1 = convertToHash(loweredStr1);
  const hashOfStr2 = convertToHash(loweredStr2);
  if (
    Object.keys(hashOfStr1).length == 0 &&
    Object.keys(hashOfStr2).length == 0
  ) {
    return 65536;
  }
  const answer = Math.floor(
    (intersectionLength(hashOfStr1, hashOfStr2) /
      unionLength(hashOfStr1, hashOfStr2)) *
      65536
  );
  return answer;
};

0개의 댓글