[프로그래머스/Lv. 2] [1차] 뉴스 클러스터링 (JAVA)
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
// 다 대문자로 만들기
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<String> intersect = new ArrayList<>();
List<String> union = new ArrayList<>();
// 두 글자씩 끊어 다중집합 만들기
for(int i = 0 ; i < str1.length() - 1 ; i++) {
if('A' <= str1.charAt(i) && str1.charAt(i) <= 'Z' && 'A' <= str1.charAt(i + 1) && str1.charAt(i + 1) <= 'Z')
list1.add(str1.substring(i, i + 2));
}
for(int i = 0 ; i < str2.length() - 1; i++) {
if('A' <= str2.charAt(i) && str2.charAt(i) <= 'Z' && 'A' <= str2.charAt(i + 1) && str2.charAt(i + 1) <= 'Z')
list2.add(str2.substring(i, i + 2));
}
// 중복 원소 처리 위한 정렬
Collections.sort(list1);
Collections.sort(list2);
// 교집합 구하기
for(String s : list1) {
if(list2.remove(s)) {
intersect.add(s);
}
union.add(s);
}
// 합집합 구하기 (= union.addAll(list2))
for(String s : list2) {
union.add(s);
}
// 자카드 유사도 구하기
double jakard = 0;
if(union.size() == 0) { // 공집합인 경우
jakard = 1;
}
else {
jakard = (double) intersect.size() / (double) union.size();
}
return (int) (jakard * 65536);
}
}
|
cs |
🧩 해결 아이디어
• 구현
- 두 문자열을 다 대문자로 만든다.
- 두 문자열을 각각 두 글자씩 끊어 다중집합을 만든다.
- 중복 원소 처리를 위해, 두 다중집합 리스트를 정렬한다.
- 두 리스트의 교집합을 구한다.
=> 첫 번째 다중집합에 있는 원소가 두 번째 다중집합에 있어 성공적으로 원소를 제거했다면,
두 번째 다중집합에서 해당 원소를 제거하고, 교집합에 넣는다.
for(String s : list1) {
if(list2.remove(s)) {
intersect.add(s);
}
union.add(s);
}
- 두 번째 다중집합의 남은 원소를 합집합에 넣어 합집합을 완성시킨다.
union.addAll(list2);
- 자카드 유사도를 구한다. (단, 공집합이면 1)
💥 유의사항
- double형 주의...
💬 느낀 점
리스트A.addAll(리스트B)
하면 리스트A에 리스트B 원소가 한 방에 다 들어간다.... 신기방기...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
- 풀이
[프로그래머스 - Java] [1차] 뉴스 클러스터링 (2018 KAKAO BLIND RECRUITMENT)
문제 코딩테스트 연습 - [1차] 뉴스 클러스터링 뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Da
minhamina.tistory.com
+ 리스트에서 원하는 객체 찾아 삭제하는 방법
list.removeIf(str -> str.equals("A"));
JAVA List for 문으로 remove하기
List 에 있는 목록 중 원하는 객체를 삭제하는 방법. 맨 처음에는 가장 간단하게 for문으로 돌리면서 찾아서 삭제를 했다. import java.util.*; public class test { public static void main(String[] args) { List list = new
hi-dot.tistory.com