코테/프로그래머스

[프로그래머스/Lv. 2] [1차] 뉴스 클러스터링 (JAVA)

imname1am 2023. 11. 26. 00:44
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

 

반응형