[프로그래머스 level2] 뉴스 클러스팅_카카오 2018

김예지·2021년 10월 22일
0

문제

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


문제 풀이

코드

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

function solution(str1, str2) {
  //각각의 집합 
  const arr1=makeArr(str1);
  const arr2=makeArr(str2);    
    
  const set=new Set([...arr1, ...arr2]);
  let union=0, inter=0;
  set.forEach(item => {
      const arr1Cnt=arr1.filter(v=>v===item).length;
      const arr2Cnt=arr2.filter(v=>v===item).length;
      inter+=Math.min(arr1Cnt, arr2Cnt);
      union+=Math.max(arr1Cnt, arr2Cnt);
  });  
  return union===0? 65536:parseInt(inter/union*65536);
}

와... 이문제는 만만하게 봤다가 큰코닥친 문제다. 엄청 쉬울것같았는데, 계속해서 막혔다.

  1. 각각집합 구하는건 쉬웠는데, 교집합은 min으로 처리해줘야하고 합집합은 max로 처리해주는거에서 막혔다.

  2. 교집합, 합집합 겨우 구현했더니 처음에 쉽다고 구현해낸 집합처리가 제대로 안됐나보다. 테스트케이스가 잘 작동하지 않았다.
    난 처음부터 str1, str2에서 영어가 아닌걸 모두 제외하고 소문자로 모두 바꾼 후 시작했는데, 이렇게 하면 안됐다. (str1=str1.replace(/[^a-z]/g, '').toLowerCase()처럼)
    이렇게 하면 '기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.'의 조건을 만족하지 못한다.
    예를들어 E=M*C^2의 사례에서 위처럼 모두 제외한 후에 집합을 만들면 emce->{em,mc,ce}이지만 사실상 조건에 따라 두개씩 짝지었을 때 기호에 모두 걸리기때문에 집합은 {}, 즉 공집합이 된다.

  3. '집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의한다.'을 만족하기 위해 합집합이 0일때(즉, 두집합이 공집합일때) 1(자카드유사도)*65536을 리턴해준다.

쉽다고 만만하게 보면 안된다! 풀면서 키보드 부수고 싶은 문제였지만🤣 이문제를 통해 많이 배운 것 같다.
🔥문제를 풀기전에 문제 파악부터 제대로 하자!
🔥제한사항을 잘 읽자!


참고

profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

0개의 댓글