PCCP/프로그래머스

[PCCP Java] [1차] 뉴스 클러스터링

Life Log 2025. 8. 8. 23:09
728x90
반응형

📎 문제 링크: 프로그래머스 뉴스 클러스터링

✅ 문제 핵심 요약

  • 두 문자열을 두 글자씩 끊어 다중집합으로 구성

  • 영문자가 아닌 쌍은 제외

  • 대소문자 구분 없음

  • 두 다중집합 간의 자카드 유사도 계산

    • 자카드 유사도 J(A, B) = |A ∩ B| / |A ∪ B|
    • 단, 두 집합이 모두 공집합이면 유사도는 1
  • 최종 출력: 자카드 유사도 * 65536소수점 버리고 정수 리턴


✅ 문제 접근 방식

  1. 문자열을 소문자로 변환하고, 두 글자씩 끊어 유효한 쌍을 추출
  2. 추출된 쌍으로 다중집합을 구성 (HashMap 사용)
  3. 교집합은 min(map1[i], map2[i]), 합집합은 max(map1[i], map2[i])로 계산
  4. 유사도 계산 후 65536을 곱하여 정수로 반환

✅ Java 풀이 코드

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int mul = 65536;

        HashMap<String, Integer> map1 = preprocess(str1.toLowerCase());
        HashMap<String, Integer> map2 = preprocess(str2.toLowerCase());

        // 둘 다 공집합이면
        if(map1.size() == 0 && map2.size() == 0)
            return mul;

        double nGyo = 0, nHab = 0;
        Set<String> allKeys = new HashSet<>();
        allKeys.addAll(map1.keySet());
        allKeys.addAll(map2.keySet());

        for(String key : allKeys) {
            int count1 = map1.getOrDefault(key, 0);
            int count2 = map2.getOrDefault(key, 0);
            nGyo += Math.min(count1, count2);
            nHab += Math.max(count1, count2);
        }

        return (int)((nGyo / nHab) * mul);
    }

    private HashMap<String, Integer> preprocess(String str) {
        HashMap<String, Integer> map = new HashMap<>();
        for(int i = 0; i < str.length() - 1; i++) {
            char c1 = str.charAt(i);
            char c2 = str.charAt(i + 1);
            if(Character.isLetter(c1) && Character.isLetter(c2)) {
                String key = "" + c1 + c2;
                map.put(key, map.getOrDefault(key, 0) + 1);
            }
        }
        return map;
    }
}

✅ 개선 포인트 및 설명

  • HashSet을 별도로 관리하지 않고 map1.keySet()map2.keySet()의 합집합을 직접 사용 → 중복 제거 및 코드 간결화
  • ✅ 교집합과 합집합 계산 시 중복 원소의 개수를 min, max로 정확히 반영

✅ 예제 출력 결과

str1 str2 결과값
"FRANCE" "french" 16384
"handshake" "shake hands" 65536
"aa1+aa2" "AAAA12" 43690
"E=M*C^2" "e=m*c^2" 65536

✅ 마무리

문자열을 다중집합으로 해석하고 자카드 유사도를 계산하는 이 문제는 문자 전처리, Map 활용, 문자열 비교, 수학적 개념 구현 능력을 골고루 요구합니다.
PCCP 유형 중에서도 실전 감각을 익히기에 좋은 문제이므로 꼭 직접 구현해보시길 추천드립니다.


이 블로그 포스트는 PCCP 연습 중 하나로, 실무에서도 활용될 수 있는 텍스트 유사도 계산 로직을 연습하기에 적합합니다.

728x90
반응형