본문 바로가기
코딩테스트/프로그래머스

[프로그래머스] 2018 KAKAO > 뉴스 클러스터링 - 자바스크립트

by 핸디(Handy) 2021. 8. 30.

[ 문제 설명 ]

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr


[ 아이디어 ]

  1. 대소문자를 구별하지 않는 조건을 위해 소문자로 전체 문자열 변경
  2. 각각의 문자열에서 2개씩 읽어가면서 조건 "알파벳으로만 이루어짐"에 따라 정규식만들고 아닌것은 쳐냄(각각 A, B 집합)
  3. 자카드 유사도를 위해 합집합과 교집합을 구하는데, A 기준으로 B에도 있는건 교집합(Intersection), 그리고 B에서 제거
  4. 자카드 유사도 식 ( 교집합 / 합집합)에 넣고 처리.

[ 코드 ]

function solution(str1, str2) {
  let answer = 0;

  // 1.대소문자를 구별하지 않는 조건을 위해 소문자로 전체 문자열 변경
  let lowerStr1 = str1.toLocaleLowerCase();
  let lowerStr2 = str2.toLocaleLowerCase();

  let str1List = [];
  let str2List = [];
  let interSectionList = [];

  // 2. 각각의 문자열에서 2개씩 읽어가면서 조건 "알파벳으로만 이루어짐"에
  //    따라 정규식만들고 아닌것은 쳐냄(각각 A, B 집합)
  let alphaRex = /^[a-zA-Z]*$/;
  for (let i = 0; i < lowerStr1.length - 1; i++) {
    let testStr = lowerStr1.slice(i, i + 2);
    if (alphaRex.test(testStr)) {
      str1List.push(lowerStr1.slice(i, i + 2));
    }
  }
  for (let j = 0; j < lowerStr2.length - 1; j++) {
    let testStr = lowerStr2.slice(j, j + 2);
    if (alphaRex.test(testStr)) {
      str2List.push(lowerStr2.slice(j, j + 2));
    }
  }

  // 자카드 유사도를 위해 합집합과 교집합을 구하는데,
  // A 기준으로 B에도 있는건 교집합(Intersection), 그리고 B에서 제거
  str1List.forEach((item) => {
    let matchIndex = str2List.indexOf(item);
    if (matchIndex >= 0) {
      interSectionList.push(item);
      str2List.splice(matchIndex, 1);
    }
  });

  // 자카드 유사도 식 ( 교집합 / 합집합)에 넣고 처리.
  // 그리고 예외 조건 처리
  if (str1List.length == 0 && str2List.length == 0) return 65536;
  answer = Math.floor((interSectionList.length / (str1List.length + str2List.length)) * 65536);

  return answer;
}

 

[ 팁 ]

수학의 정석 1집합편을 잘 봐서 풀수 있었음


댓글