[프로그래머스] 뉴스 클러스터링 - javascript

Yongwoo Cho·2021년 12월 8일
0

알고리즘

목록 보기
56/104
post-thumbnail

📌 문제

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

📌 풀이

function solution(str1, str2) {
  var answer = 0;
  let arr1 = new Array();
  let arr2 = new Array();
  
  str1 = str1.toLowerCase();
  str2 = str2.toLowerCase();
  
  for (let i = 0; i < str1.length - 1; i++) {
    if (
      str1.charCodeAt(i) >= 97 &&
      str1.charCodeAt(i) <= 122 &&
      str1.charCodeAt(i + 1) >= 97 &&
      str1.charCodeAt(i + 1) <= 122
    ) {
      let tmp = "";
      tmp += str1[i];
      tmp += str1[i + 1];
      arr1.push(tmp);
    } else {
      continue;
    }
  }
  for (let i = 0; i < str2.length - 1; i++) {
    if (
      str2.charCodeAt(i) >= 97 &&
      str2.charCodeAt(i) <= 122 &&
      str2.charCodeAt(i + 1) >= 97 &&
      str2.charCodeAt(i + 1) <= 122
    ) {
      let tmp = "";
      tmp += str2[i];
      tmp += str2[i + 1];
      arr2.push(tmp);
    } else {
      continue;
    }
  }
  
  let both_arr = [];
  let plus_arr = [];

  for (let i = 0; i < arr2.length; i++) {
    if (arr1.indexOf(arr2[i]) >= 0) {
      both_arr.push(arr1.splice(arr1.indexOf(arr2[i]), 1));
    }
    plus_arr.push(arr2[i]);
  }
  for (let i = 0; i < arr1.length; i++) {
    plus_arr.push(arr1[i]);
  }

  if (both_arr.length === 0 && plus_arr.length === 0) {
    return 65536;
  }
  return parseInt(65536 * (both_arr.length / plus_arr.length));
}

✔ 알고리즘 : 문자열 + 구현

✔ 입력받은 두 개의 문자열을 toLowerCase 메서드를 사용하여모두 소문자로 변경한다.

✔ str1, str2를 순회하며 앞뒤가 소문자인 경우만 각각 arr1, arr2에 push한다.

✔ 합집합을 나타내는 plus_arr, 교집합을 나타내는 both_arr를 선언한다.

✔ arr2를 순회하며 indexOf >= 0 으로 현재 탐색하고 있는 arr2의 인덱스의 문자열이 arr1에 있다면 교집합에 넣어주고 arr1에서 그 원소를 splice를 통해 제거한다. 교집합인 원소는 당연히 합집합이므로 합집합에도 넣어준다.

✔ arr2를 순회하고도 arr1에 남아있는 문자열은 교집합은 아니지만 합집합에 속하는 원소이므로 합집합에 넣어준다

✔ 예외상황은 합집합이 없는 경우 (당연히 교집합도 없음) 이다. 따라서 이 경우를 예외처리 해준다.

✔ 난이도 : 프로그래머스 기준 LEVEL 2

profile
Frontend 개발자입니다 😎

0개의 댓글