[프로그래머스] [1차] 뉴스 클러스터링 (JS)

hhkim·2023년 9월 2일
0

Algorithm - JavaScript

목록 보기
121/188
post-thumbnail

풀이 과정

  1. 주어진 문자열을 2글자씩 잘라서 배열 만들기: slice(), push()
    이때 영문이 아닌 문자가 섞여 있으면 제외
    영문자는 모두 대문자로 변환
  2. 1의 두 배열을 합해서 중복을 제거한 배열 생성: concat(), Set()
    이때 결과의 길이가 0이면 유사도는 1 => 결과 리턴
  3. 2번 배열의 각 요소에 대해 반복
  4. 현재 요소가 1번의 두 배열에 있는 개수 세기: filter()
  5. 두 수 중 작은 수만큼 교집합 문자열에, 큰 수만큼 합집합 문자열에 추가: Math.min(), Math.max(), repeat()
  6. 결과 구하기: 교집합 길이 / 합집합 길이

코드

const N = 65536;

function solution(str1, str2) {
  const arr1 = sliceStr(str1);
  const arr2 = sliceStr(str2);
  const arr = Array.from(new Set(arr1.concat(arr2)));
  if (!arr.length) return N;

  let inter = '';
  let union = '';
  for (const e of arr) {
    const cnt1 = countElement(arr1, e);
    const cnt2 = countElement(arr2, e);
    inter = inter + e.repeat(Math.min(cnt1, cnt2));
    union = union + e.repeat(Math.max(cnt1, cnt2));
  }
  return Math.trunc((inter.length / union.length) * N);
}

function sliceStr(str) {
  const arr = [];
  for (let i = 0; i < str.length - 1; ++i) {
    const tmp = [...str]
      .slice(i, i + 2)
      .join('')
      .toUpperCase();
    if (!/^[A-Z]*$/g.test(tmp)) continue;
    arr.push(tmp);
  }
  return arr;
}

function countElement(arr, el) {
  return arr.filter((c) => c === el).length;
}

0개의 댓글