[JAVA 문제 풀이] 333. 뉴스 클러스터링

프로그래머스 (17677)
Stupefyee's avatar
Jun 20, 2025
[JAVA 문제 풀이] 333. 뉴스 클러스터링
notion image
notion image
 

내가 작성한 코드

import java.util.*; public class Solution { public static int solution(String str1, String str2) { // 각각의 문자열로부터 유효한 2글자 조합(영문자만)을 추출 List<String> list1 = makeBigrams(str1); List<String> list2 = makeBigrams(str2); // 각 리스트에 포함된 원소들의 출현 횟수를 세어 Map으로 변환 Map<String, Integer> map1 = getCountMap(list1); Map<String, Integer> map2 = getCountMap(list2); int intersection = 0; // 교집합 크기 int union = 0; // 합집합 크기 // 두 map에서 사용된 모든 key들을 집합으로 통합 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); // 교집합은 각 원소별 최소값 intersection += Math.min(count1, count2); // 합집합은 각 원소별 최대값 union += Math.max(count1, count2); } // 둘 다 공집합이면 유사도는 1로 간주 if (union == 0) { return 65536; }; // 유사도를 65536을 곱한 정수로 반환 return (int) ((double) intersection / union * 65536); } // 문자열에서 2글자씩 끊고 영문자인 경우만 리스트로 반환 private static List<String> makeBigrams(String str) { List<String> result = new ArrayList<>(); str = str.toLowerCase(); // 대소문자 구분 없이 비교 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)) { result.add("" + c1 + c2); } } return result; } // 리스트에 있는 각 문자열의 등장 횟수를 세어 Map으로 반환 private static Map<String, Integer> getCountMap(List<String> list) { Map<String, Integer> map = new HashMap<>(); for (String s : list) { map.put(s, map.getOrDefault(s, 0) + 1); } return map; } }
Share article

stupefyee