https://programmers.co.kr/learn/courses/30/lessons/17677
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
카카오 블라인드 테스트에서 출제된 문제이고, Level 2 이다.
문자열 비교를 통해서 두 문자열 간 부분 문자열(2자, 영문자만 허용) 간 자카드 유사도를 계산하는 문제이다.
첫 문자열을 2개 문자로 쪼갠 기준으로 두번째 문자열을 첫 문자열과 비교해서 교집합, 합집합 개수를 계산하여 리턴하면 된다.
다만 유의할 것으로는, 합집합 개수가 하나도 없는 경우에도 divide by zero 예외가 발생할 수 있어서 이런 경우에는 65536 값을 리턴하면 된다.
예제 코드는 다음과 같다.
import java.util.*;
class Solution {
final static int LIMIT = 65536;
public static int solution(String str1, String str2) {
Map<String, Integer> map = new HashMap<>();
int str1Count = 0, str2Count = 0;
int commonCount = 0;
for (int i = 0; i < str1.length()-1; i++) {
String subStr = str1.substring(i,i+2).toLowerCase(Locale.ROOT);
if (subStr.charAt(0) >= 'a' && subStr.charAt(0) <= 'z' && subStr.charAt(1) >= 'a' && subStr.charAt(1) <= 'z') {
map.put(subStr,map.getOrDefault(subStr,0)+1);
str1Count++;
}
}
for (int i = 0; i < str2.length()-1; i++) {
String subStr = str2.substring(i,i+2).toLowerCase(Locale.ROOT);
if (subStr.charAt(0) >= 'a' && subStr.charAt(0) <= 'z' && subStr.charAt(1) >= 'a' && subStr.charAt(1) <= 'z') {
if (map.get(subStr) != null && map.get(subStr) > 0) {
map.put(subStr, map.get(subStr)-1);
commonCount++;
}
str2Count++;
}
}
int sumCount = str1Count + str2Count - commonCount;
if (sumCount == 0) return LIMIT;
double answer = LIMIT * commonCount / sumCount;
return (int) answer;
}
}'코딩테스트' 카테고리의 다른 글
| [프로그래머스] 예상 대진표 (0) | 2022.05.29 |
|---|---|
| [프로그래머스] 124 나라의 숫자 (0) | 2022.05.28 |
| [프로그래머스] 징검다리 (0) | 2022.05.08 |
| [프로그래머스] 단속 카메라 (0) | 2022.05.08 |
| [프로그래머스] 섬 연결하기 (0) | 2022.05.07 |