[프로그래머스 레벨투] 뉴스 클러스터링 🗞

9rganizedChaos·2021년 10월 8일
0
post-thumbnail

🔽 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/17677

✍🏼 나의 수도 코드

// 1) str1과 str2를 먼저 두글자씩 끊어서 다중집합의 원소로 만들고 해당 원소들을 배열에 담아둔다.
// 1-1) map을 활용해 n+1인덱스를 더하도록 한다.
// 2) 두 배열에서 특수문자가 포함된 경우들을 모두 제외하고, 모두 소문자로 만든다.
// 3) 합집합과 교집합을 계산해, 유사도를 출력한다.
// 3-1) 두 배열을 모두 객체로 변환한다. 교집합은 공통된 것들을 모으고, 합집합은 전체를 다 모으고!
// 이 때 공통된 것들은 교집합의 경우 더 작은 수, 합집합은 큰 수로!

👨🏻‍💻 나의 문제 풀이

function solution(str1, str2) {
    
    let alpha = "abcdefghijklmnopqrstuvwxyz"
    
    let str1Arr = str1.split("").map(letter => letter.toLowerCase());
    let str2Arr = str2.split("").map(letter => letter.toLowerCase());
    
    let str1MultiSets = str1Arr.map((letter, index) => letter + str1Arr[index + 1]).slice(0, str1Arr.length - 1).filter(el => el.split("").every(el => alpha.includes(el)));
    let str2MultiSets = str2Arr.map((letter, index) => letter + str2Arr[index + 1]).slice(0, str2Arr.length - 1).filter(el => el.split("").every(el => alpha.includes(el)));
    
    let str1Obj = {};
    let str2Obj = {};
    
    str1MultiSets.forEach(el => str1Obj[el] ? str1Obj[el]++ : str1Obj[el] = 1);
    str2MultiSets.forEach(el => str2Obj[el] ? str2Obj[el]++ : str2Obj[el] = 1);

    let intersection = {};
    let union = JSON.parse(JSON.stringify(str2Obj));
    
    Object.keys(str1Obj).forEach(el => {
        if(str2Obj[el]){
            intersection[el] = Math.min(str1Obj[el], str2Obj[el]);
            union[el] = Math.max(str1Obj[el], str2Obj[el])
        } else {
            union[el] = str1Obj[el];
        }
    })
    
    let intersectionNum = 0;
    let unionNum = 0;
        
    Object.keys(intersection).forEach(key => intersectionNum += intersection[key])
    Object.keys(union).forEach(key => unionNum += union[key])
    
    if(unionNum === 0) return 65536;
    return Math.floor(intersectionNum / unionNum * 65536);
}

👩🏻‍💻 다른 사람의 코드

function solution (str1, str2) {

  function explode(text) {
    const result = [];
    for (let i = 0; i < text.length - 1; i++) {
      const node = text.substr(i, 2);
      if (node.match(/[A-Za-z]{2}/)) {
        result.push(node.toLowerCase());
      }
    }
    return result;
  }

  const arr1 = explode(str1);
  const arr2 = explode(str2);
  const set = new Set([...arr1, ...arr2]);
  let union = 0;
  let intersection = 0;

  set.forEach(item => {
    const has1 = arr1.filter(x => x === item).length;
    const has2 = arr2.filter(x => x === item).length;
    union += Math.max(has1, has2);
    intersection += Math.min(has1, has2);
  })
  return union === 0 ? 65536 : Math.floor(intersection / union * 65536);
}

🍯 알게 된 것들

  • if (node.match(/[A-Za-z]{2}/)) 정규표현식을 학습하자!(+Match 함수!)
  • new Set([...arr1, ...arr2]); set 객체! 배열의 중복 요소 삭제 가능!
profile
부정확한 정보나 잘못된 정보는 댓글로 알려주시면 빠르게 수정토록 하겠습니다, 감사합니다!

0개의 댓글