728x90
반응형
📎 문제 링크: 프로그래머스 뉴스 클러스터링
✅ 문제 핵심 요약
두 문자열을 두 글자씩 끊어 다중집합으로 구성
영문자가 아닌 쌍은 제외
대소문자 구분 없음
두 다중집합 간의 자카드 유사도 계산
- 자카드 유사도 J(A, B) = |A ∩ B| / |A ∪ B|
- 단, 두 집합이 모두 공집합이면 유사도는 1
최종 출력:
자카드 유사도 * 65536→ 소수점 버리고 정수 리턴
✅ 문제 접근 방식
- 문자열을 소문자로 변환하고, 두 글자씩 끊어 유효한 쌍을 추출
- 추출된 쌍으로 다중집합을 구성 (HashMap 사용)
- 교집합은
min(map1[i], map2[i]), 합집합은max(map1[i], map2[i])로 계산 - 유사도 계산 후 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
반응형
'PCCP > 프로그래머스' 카테고리의 다른 글
| [PCCP JAVA] 땅따먹기 (2) | 2025.08.09 |
|---|---|
| [프로그래머스 JAVA] 최대공약수와 최소공배수 (0) | 2025.06.22 |
| [프로그래머스 JAVA] 징검다리 건너기 (0) | 2025.06.03 |
| [프로그래머스 JAVA] 순위 검색 (1) | 2025.06.03 |
| [프로그래머스 JAVA] 소수 찾기 (0) | 2025.06.01 |