코딩테스트

[프로그래머스] 뉴스 클러스터링 (JS)

여유로운 프론트엔드 개발자 2024. 11. 3. 14:00

문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

  (1) 비교할 문자열을 소문자로 통일시킨 후 알파벳으로만 이루어진 문자열인지 검사하여 배열에 push한다.

  (2) 배열의 filter 메서드와 concat 메서드를 사용하여 교집합, 합집합을 구한다. temp 배열 생성 후 교집합에 포함된 문자열은 제거한다. (합집합을 구할 때 중복 문자열이 들어가는 것을 방지하기 위해) 

  (3) 문제 조건에 맞게 65536을 곱한 후에 소수점 아래를 버리고 정수만 return한다.

function solution(str1, str2) {
    const leftStr = [];
    const rightStr = [];

    const lowerStr1 = str1.toLowerCase();
    const lowerStr2 = str2.toLowerCase();

    for (let i = 0; i < lowerStr1.length - 1; i++) {
        const substringStr = lowerStr1.substring(i, i + 2);
        if (/^[a-z]{2}$/.test(substringStr)) {
            leftStr.push(substringStr);
        }
    }

    for (let i = 0; i < lowerStr2.length - 1; i++) {
        const substringStr = lowerStr2.substring(i, i + 2);
        if (/^[a-z]{2}$/.test(substringStr)) { 
            rightStr.push(substringStr);
        }
    }

    const {intersection, union} = getIntersectionAndUnion(leftStr, rightStr);
    const jacquard = union.length === 0 ? 1 : intersection.length / union.length;

    const answer = Math.floor(jacquard * 65536);
    return answer;
}

const getIntersectionAndUnion = (arr1, arr2) => {
    const arr2Copy = [...arr2];
    const intersection = arr1.filter(item => {
        const index = arr2Copy.indexOf(item);
        if (index > -1) {
            arr2Copy.splice(index, 1);
            return true;
        }
        return false;
    });

    const union = arr1.concat(arr2Copy);

    return {
        intersection,
        union
    };
}

 

결론

카카오 레벨2 문제이다.

교집합과 합집합을 구하는 방법은 여러개 존재하지만 그 중에서 배열 메서드를 사용하여 문제를 해결하였다.