1. 문제
https://programmers.co.kr/learn/courses/30/lessons/17677?language=java
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
2. 나의 풀이
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
//System.out.println("str1 : " + str1 + ", str2 : " + str2);
ArrayList <String> str1_arr = new ArrayList<>();
ArrayList <String> str2_arr = new ArrayList<>();
for(int i = 0; i < str1.length() - 1; i = i + 1) {
if(str1.charAt(i) < 65 || str1.charAt(i) > 90) {
continue;
}
if(str1.charAt(i + 1) < 65 || str1.charAt(i + 1) > 90) {
continue;
}
str1_arr.add(str1.substring(i, i + 2));
}
for(int i = 0; i < str2.length() - 1; i = i + 1) {
if(str2.charAt(i) < 65 || str2.charAt(i) > 90) {
continue;
}
if(str2.charAt(i + 1) < 65 || str2.charAt(i + 1) > 90) {
continue;
}
str2_arr.add(str2.substring(i, i + 2));
}
//System.out.println("str1_arr : " + str1_arr);
//System.out.println("str2_arr : " + str2_arr);
if(str1_arr.size() == 0 && str2_arr.size() == 0) {
return 65536;
}
boolean [] str1_visited = new boolean[str1_arr.size()];
boolean [] str2_visited = new boolean[str2_arr.size()];
int gyo = 0;
for(int i = 0; i < str1_arr.size(); i = i + 1) {
for(int j = 0; j < str2_arr.size(); j = j + 1) {
if(str2_visited[j] == true) {
continue;
}
if(str1_arr.get(i).equals(str2_arr.get(j))) {
str2_visited[j] = true;
gyo++;
break;
}
}
}
int hab = str1_arr.size() + str2_arr.size() - gyo;
//System.out.println("gyo : " + gyo + ", hab : " + hab);
answer = (int)(((double)gyo / hab) * 65536);
return answer;
}
}
3. 다른 사람 풀이
import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(String str1, String str2) {
List<String> set1 = extractValidElements(str1);
List<String> set2 = extractValidElements(str2);
if (set1.isEmpty() && set2.isEmpty()) {
return 65536;
}
int intersectionSize = 0;
int unionSize = 0;
while (!set1.isEmpty()) {
String target = set1.get(0);
int targetSizeOfSet1 = 0;
int targetSizeOfSet2 = 0;
while (set1.contains(target)) {
set1.remove(target);
targetSizeOfSet1++;
}
while (set2.contains(target)) {
set2.remove(target);
targetSizeOfSet2++;
}
if (targetSizeOfSet2 > 0) {
intersectionSize += Math.min(targetSizeOfSet1, targetSizeOfSet2);
unionSize += Math.max(targetSizeOfSet1, targetSizeOfSet2);
} else {
unionSize += targetSizeOfSet1;
}
}
unionSize += set2.size();
double j = (double) intersectionSize / unionSize;
int answer = (int) (j * 65536);
return answer;
}
private static List<String> extractValidElements(String str) {
List<String> set = new ArrayList<>();
for (int i = 0; i < str.length() - 1; i++) {
String temp = str.substring(i, i + 2);
if (!((temp.charAt(0) >= 'A' && temp.charAt(0) <= 'Z')
|| (temp.charAt(0) >= 'a' && temp.charAt(0) <= 'z'))) {
continue;
}
if (!((temp.charAt(1) >= 'A' && temp.charAt(1) <= 'Z')
|| (temp.charAt(1) >= 'a' && temp.charAt(1) <= 'z'))) {
continue;
}
set.add(temp.toUpperCase());
}
return set;
}
}
'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 캐시 (0) | 2020.11.30 |
---|---|
(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 프렌즈4블록 (0) | 2020.11.30 |
(Java)프로그래머스 코딩테스트 연습 - 2017팁스타운 - 예상 대진표 (0) | 2020.11.29 |
(Java)프로그래머스 코딩테스트 연습 - Summer/Winter Coding(~2018) - 영어 끝말잇기 (0) | 2020.11.29 |
(Java)프로그래머스 코딩테스트 연습 - Summer/Winter Coding(~2018) - 점프와 순간 이동 (0) | 2020.11.29 |