새소식

알고리즘/문제

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

  • -

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/17677

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr


static int solution(String str1, String str2) {
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
ArrayList<String> al1 = new ArrayList<>();
ArrayList<String> al2 = new ArrayList<>();
for(int i=0; i<str1.length()-1; i++){
String temp = str1.substring(i, i+2);
if(Pattern.matches("^[A-Z]*$", temp)){
al1.add(temp);
}
}
for(int i=0; i<str2.length()-1; i++){
String temp = str2.substring(i, i+2);
if(Pattern.matches("^[A-Z]*$", temp)){
al2.add(temp);
}
}
int gyo = 0;
int hab = al1.size() + al2.size();
for(int i=0; i<al1.size(); i++){
Loop1:
for(int j=al2.size()-1; j>=0; j--){
if(al1.get(i).equals(al2.get(j))){
gyo++;
al2.remove(j);
break Loop1;
}
}
}
hab -= gyo;
double temp = (hab != 0) ? (double)gyo/hab : 1;
return (int)Math.floor(temp * 65536);
}

일단 문제를 읽어보면 각 문자열을 연달아 2개의 문자씩 나눠서 집합을 구성한 다음 

"ABCDE"의 경우 -> {"AB", "BC", "CD", "DE"} 

두 문자열의 다중집합끼리의 자카드 유사도를 구하면 된다

자카드 유사도는 문제에서 알려준 것처럼 '교집합/합집합' 의 값이다

 

크게 보면 위의 예시처럼 집합을 만들면서 답을 구하는 과정에서 체크해야 할 사항

  • 2글자 중 한글자라도 알파벳이 아닌 경우 집합에 포함시키지 않는다  >  정규식으로 처리
  • 입력으로 받은 문자열을 바로 알파벳이 아닌 문자를 삭제하면 안된다 ( aa1+aa2,  AAAA12 경우를 손으로 해보면 앎 )
  • 대소문자는 구별하지 않는다  >  바로 대문자처리
  • 교집합을 구하면서 교집합 처리된 원소  >  삭제or 사용플래그 처리
{"AA", "AA", "AA"} 와 {"AA", "AA", "AA", "AA", "AA"} 인 경우 문제 설명처럼
교집합은 3 합집합이 5가 나와야 함. 
  • 그리고 합집합이 0인 경우  >  0으로 나누기가 불가능하고 교집합도 0이란 의미이므로 합집합의 값을 1로 설정

이후 출력방식에 맞게 조절했다

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.