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

쿼카쿼카·2023년 2월 25일
0

알고리즘

목록 보기
39/67

코드

// 조금 길어도 시간은 아주 조금 빠름
// function solution(str1, str2) {
//     let ans = 0;
//     const str1Arr = [], str2Arr = [];
//     const str1Dup = {}, str2Dup = {}
//     const inter = new Set();
//     let interCount = 0

//     str1 = str1.toLowerCase();
//     str2 = str2.toLowerCase();

//     function sliceStr(str, strArr) {
//         for(let i=0; i<str.length-1; i++) {
//             strArr.push(str.slice(i, i+2));
//         }
//     }

//     function dupCheck(str, strDup) {
//         for(let i=0; i<str.length; i++) {
//             if(str.indexOf(str[i], i+1)+1) {
//                 strDup[str[i]] = (strDup[str[i]] || 1) + 1;
//             }
//             if(str === str1) {
//                 if(str2.indexOf(str1[i])+1) inter.add(str1[i])
//             }
//         }
//     }

//     sliceStr(str1, str1Arr);
//     sliceStr(str2, str2Arr);

//     str1 = str1Arr.filter(x => x.match(/[a-z][a-z]/));
//     str2 = str2Arr.filter(x => x.match(/[a-z][a-z]/));
    
//     if(str1.length + str2.length === 0) return 65536;

//     dupCheck(str1, str1Dup);
//     dupCheck(str2, str2Dup);
    
//     const interArr = [...inter];
//     for(let i=0; i<interArr.length; i++) {
//         const iCount = Math.min(str1Dup[interArr[i]] || 1, str2Dup[interArr[i]] || 1);
//         interCount += iCount;
//     }
        
//     return Math.floor((interCount / (str1.length + str2.length - interCount)) * 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;
    const setArr = [...set];
    // for과 forEach 속도 비교
    for(let i=0; i<setArr.length; i++) {
        const has1 = arr1.filter(x => x === setArr[i]).length;
        const has2 = arr2.filter(x => x === setArr[i]).length;
        union += Math.max(has1, has2);
        intersection += Math.min(has1, has2);
    }

  // 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);
}

시간은 오래걸렸지만 겁나 뿌듯해!!!!!!

  • 진짜 정석 루트대로 갔어요!! 정석 맞나? 변수 겁나 많은거 봐 우웩
  • 소문자로 만들고! 2개 씩 자르고! 영어만 남기고! 중복인 애들 몇 개 있나 찾고! 그 외 기타 등등
  • 진짜 멋있는 건 나 함수를 사용해 버렸어요!ㅎㅎㅎㅎ 반복이 많아서 함수로 리팩토링까지 했어요
  • 그렇게 해서 교집합을 구하고! 합집합은 둘을 더한 후 교집합을 빼면 되니까 return 도 작살나게 만들어버렸어요ㅎㅎ
  • 시간 제가 아주 조오오오오금 짧은데 이거가지고 생색내는 거 보면 하남자가 맞는 듯

Set을 이용한 짧은 풀이

  • set을 이용해 처음부터 합쳐두고 각각에 필터로 길이를 측정하여 중복 값 얻음
  • for도 해보고 forEach도 해봤는데 fordl 아주 조금 빨라여!
profile
쿼카에요

0개의 댓글