알고리즘 문제/[프로그래머스]

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

latter2005 2021. 4. 2. 02:58

2018 카카오 채용 코딩 테스트 문제입니다.

 

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

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

programmers.co.kr

문제 확인

 

Map 컨테이너 활용 문제입니다.

 

풀이

 

대소문자 구분을 하지 않기 때문에 처음 입력받은 두 문자열을 toLowerCase() 메서드를 통해 모두 소문자로 만들어줍니다.

 

Map 컨테이너를 통해 다중집합 원소들을 처리할 수 있습니다.

Map <원소, 등장 횟수>로 선언하고 해당 원소가 문자열에서 몇 번 등장하였는지 기록합니다.

 

등장 횟수를 통해 합집합, 교집합 원소의 개수를 알아낼 수 있습니다.

2개의 map에서 등장 횟수 중 큰 값이 합집합이 되고 작은 값이 교집합이 됩니다. 주의해야 할 점은 2개의 Map을 모두 탐색하며 공통 원소가 아니라면 이를 합집합 개수에 추가해주어야 합니다.

 

코드

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
import java.util.*;
import java.util.Map.Entry;
class Solution {
    public int solution(String str1, String str2) {
        int res;
        str1 = str1.toLowerCase();//모두 소문자로 만들기
        str2 = str2.toLowerCase();
        String key;
        Map<String, Integer> mp1 = new HashMap<String, Integer>(),
                mp2 = new HashMap<String, Integer>();//해쉬맵 사용 key : 원소, value : 등장횟수
        for(int i=0;i<str1.length()-1;i++) {
            
            if(Character.isLowerCase(str1.charAt(i)) && Character.isLowerCase(str1.charAt(i+1))) {
                key = str1.substring(i, i+2);
                if(mp1.containsKey(key))
                    mp1.put(key, mp1.get(key) + 1);//이미 있으면 +1
                else
                    mp1.put(key, 1);//없으면 새로 생성
            }
        }
        for(int i=0;i<str2.length()-1;i++) {
            if(Character.isLowerCase(str2.charAt(i)) && Character.isLowerCase(str2.charAt(i+1))) {
                key = str2.substring(i, i+2);
                if(mp2.containsKey(key))
                    mp2.put(key, mp2.get(key) + 1);
                else
                    mp2.put(key, 1);
            }
        }
        double inter = 0, union = 0;
        for(Entry<String, Integer> entry : mp1.entrySet()) {
            key = entry.getKey();
            int val = entry.getValue();
            if(mp2.containsKey(key)){//공통 원소가 있다면
                int tmp = mp2.get(key);
                if(val > tmp) {inter += tmp; union+=val;}//교집합 : 적은값, 합집합 : 큰값
                else {inter += val; union+=tmp;}
            }
            else//공통 원소가 없다면 합집합만 추가
                union+=val;
        }
        for(Entry<String, Integer> entry : mp2.entrySet()) {//str2의 원소들을 합집합에 추가
            if(!mp1.containsKey(entry.getKey()))//str1 검사하면서 추가했으므로 str1에 없는 원소만을 추가
                union+=entry.getValue();
        }
        if(union==0)return 65536;//합집합 개수가 0
        return (int)(inter / union * 65536);
    }
}
cs

 

반응형