개발 공부/알고리즘 문제 풀이

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

종범2 2020. 6. 7. 16:57

문제

프로그래머스 2018 KAKAO BLIND RECRUITMENT [1차] 뉴스 클러스터링

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

 

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

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

programmers.co.kr

언어

자바스크립트(JavaScript)

 

접근 방법

  1. 두 문자열 모두 두 글자씩 잘랐을 때 영문자 쌍이 아니면 버리고 영문자 쌍이라면 소문자로 바꾸어 새로운 배열에 넣는다. 새로운 배열을 arr1, arr2이라고 한다.
  2. 합집합은 arr1 배열에서 시작한다. 그리고 존재하는지 확인한 내용을 남기기 위해 checkArr을 정의한다.
  3. arr2 배열의 요소가 arr1에 존재하지 않으면 합집합에 그 요소를 저장한다.
  4. arr2 배열의 요소가 arr1에 존재할 때, 존재하는지 체크한 적이 있으면 다음 요소로 넘어간다. 다 넘어가면 합집합에 그 요소를 저장한다.
  5. arr2 배열의 요소가 arr1에 존재할 때, 존재하는 지 체크한 적이 없으면 합집합에 요소를 넣지 않고 교집합에 그 요소를 저장한다. 그리고 checkArr에 그 요소를 체크한 적이 있다고 표시한다.

코드

function solution(str1, str2) {
    let answer = 0;
    let arr1 = [];
    let arr2 = [];
    // 두 글자씩 끊었을 때 영문자 쌍이 아니면 버리고
    // 영문자 쌍이라면 소문자로 바꾸어 리스트에 넣는다
    for (let i=0; i<str1.length-1; i++){
        let reg = /^[a-zA-Z]+$/;
        if(reg.test(str1[i]) && reg.test(str1[i+1])){
            let str = str1[i]+str1[i+1];
            arr1.push(str.toLowerCase());    
        }
    }
    for (let i=0; i<str2.length-1; i++){
         let reg = /^[a-zA-Z]+$/;
        if(reg.test(str2[i]) && reg.test(str2[i+1])){
            let str = str2[i]+str2[i+1];
            arr2.push(str.toLowerCase());    
        }
    }
    
    if (arr1.length ===0 && arr2.length === 0){
        return 65536;
    }
    // 합집합은 arr1에서 시작
    // arr2의 요소가 arr1에 존재하지 않으면 합집합에 그 요소를 넣는다
    // arr2의 요소가 arr1에 존재할 때, 존재하는지 체크한적이 있으면 넘어간다. 다 넘어가면 합집합에 요소를 넣는다.
    // arr2의 요소가 arr1에 존재할 때, 존재하는지 체크한적이 없으면 합집합에 요소를 넣지 않고 교집합에 넣는다.
    let unionArr = Object.assign([],arr1);
    let interArr = [];
    let checkArr = [];
    for (let i=0; i<arr2.length; i++){
        let isNew = true;
        let idx = 0;
        for (let j=0; j<unionArr.length; j++){
            if ((arr2[i] === unionArr[j]) && (checkArr[j] !== true && j<arr1.length)){
                isNew = false;
                idx = j;
                break;
            }
        }
        if (isNew){
            unionArr.push(arr2[i]);
        }else{
            checkArr[idx] = true;
            interArr.push(arr2[i])
        }
    }
    console.log(arr1,arr2,unionArr,interArr);
    answer = Math.floor(interArr.length/unionArr.length*65536);
    return answer;
}

복기

  1. 합집합과 교집합 찾는 코드를 짜기가 어려웠다. 요령이 있다기보다는 문제 풀이 실력이 좋아야하는 문제이다.