[JavaScript][Programmers] 뉴스 클러스터링

조준형·2021년 9월 5일
0

Algorithm

목록 보기
125/142
post-thumbnail

🔎 뉴스 클러스터링

❓ 문제링크

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

📄 제출 코드

function solution(str1, str2) {
  str1 = str1.toUpperCase();
  str2 = str2.toUpperCase();
  let arr1 = [];
  let arr2 = [];

  for (let i = 0; i < str1.length - 1; i++) {
    let tmp = str1.substring(i, i + 2);
    if (/^[a-zA-Z]+$/.test(tmp) && tmp.length == 2){
      arr1.push(tmp);
    }
  }
  for (let i = 0; i < str2.length; i++) {
    let tmp = str2.substring(i, i + 2);
    if (/^[a-zA-Z]+$/.test(tmp)&& tmp.length == 2){
      arr2.push(tmp);
    }
  }
  console.log(arr1);
  console.log(arr2);

  let gyo = [];
  let union = [];
  // union = arr1.concat(arr2);
  for (var i = 0; i < arr2.length; i++) {
    if (arr1.indexOf(arr2[i]) >= 0) {
      gyo.push(arr1.splice(arr1.indexOf(arr2[i]), 1))
    }
    union.push(arr2[i])
  }

  for (var i = 0; i < arr1.length; i++) {
    union.push(arr1[i])
  }
  console.log(gyo);
  console.log(union);

  let answer = 0;
  union.length == 0 ? answer = 65536 : answer =parseInt((gyo.length/union.length) * 65536)

  return answer;
}

let str1 = 'aa1+aa2'
let str2 = 'AAAA12'
// console.log(solution(	"FRANCE", "french"))
console.log(solution(str1, str2));

한 3번은 지웠다 다시 작성하고 하면서 오래걸렸던거 같다.
문제는 문자열 2개가 주어지면 2글자씩 끊어서 배열을 만들고, 두 개의 배열을 비교하여 교집합과 합집합을 구해 ((교집합 / 합집합) * 65536) 을 구하는 문제다.
합집합이 없으면 65536을 그대로 리턴한다.
이 때 , 대소문자 구분은 없고, A-Z사이문자가 아닌경우 배열에서 제외한다.
위의 테스트케이스 경우

arr1 = [AA, A1, 1+, +A, AA, A2]
arr2 = [AA, AA, AA, A1, 12]

이렇게 나올텐데 arr1의 A1, 1+, +A, A2의 경우 제외되고,
arr2의 경우 A1, 12가 제거 된다.

처음에 str을 전부 대문자로 만들어 charCodeAt을 이용하여 아스키코드범위를 벗어나는 경우, 제거시키는 방법을 사용했다.
(대문자로 바꾼 이유는 그냥 숫자범위가 65~90로 모두 2자리이기 때문이다. 별다른 이유는 없다. 소문자로하면 97~122로 3자리가 나오게됨.)
그러다가 if문이 너무 길어져서 그냥 정규표현식으로 변경하였다.

그 다음 교집합과 합집합을 구하는 부분이다.
합집합을 구할 때 처음엔 Set으로 두 배열을 합쳣는데 위 테스트케이스경우 AA가 모두 1개로 합쳐져서 문제가 발생했다. 그래서 concat으로 두개를 합치고, indexOf로 같은 경우를 dIdx배열에 담아 다찾은 후 dIdx의 인덱스번째 요소들을 삭제하는데 indexOf는 가장앞의 것을 찾기 때문에 문제가 발생했다.
그래서 고민을 하다가 다른사람의 코드를 참고했다.

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

  for (var i = 0; i < arr1.length; i++) {
    union.push(arr1[i])
  }

위 방법은 arr2를 돌면서 arr1에 arr2가있으면, 교집합과 합집합에 arr2를 넣고 arr1에서는 해당위치 요소를 자른다. 이는 합집합을 구하기 위해서 이다.합집합은 두개의 교집합을 구하고 남은 차집합을 더하면 합집합이 되기 때문.
그렇게 구현하고, 요구하는 (gyo / union)*65536을 구해서 리턴하면된다.
문제에서 소수점 아래를 버리고 정수부만 출력한다.고 했기 때문에 parseInt를 이용해 정수로 만들어주었다.

📘 참고

https://velog.io/@sso/프로그래머스-javascript-1차뉴스클러스터링

profile
깃허브 : github.com/JuneHyung

0개의 댓글