본문 바로가기
문제풀이/프로그래머스

[JAVA] [1차] 뉴스 클러스터링

by PhoB 2023. 2. 21.

[문제]

 

프로그래머스

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

programmers.co.kr


[내 풀이]

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();    
        Map<String,Integer> arr1 =new HashMap<>(), arr2 = new HashMap<>(); 
        HashSet<String> set = new HashSet<>(); //합집합용
        
        for(int i=0; i<str1.length()-1; i++){
            String temp = str1.substring(i, i+2);
            if(Character.isAlphabetic(temp.charAt(0)) && 
               Character.isAlphabetic(temp.charAt(1))){
                arr1.put(temp,arr1.getOrDefault(temp,0)+1);
                set.add(temp);
            }  
        }
        
        for(int i=0; i<str2.length()-1; i++){
            String temp = str2.substring(i, i+2);
            if(Character.isAlphabetic(temp.charAt(0)) &&
               Character.isAlphabetic(temp.charAt(1))){
                arr2.put(temp,arr2.getOrDefault(temp,0)+1);
                set.add(temp);
            }   
        }
        int interSize = 0;
        for(String s : set){ //합집합 크기
            interSize +=Math.max(arr1.getOrDefault(s,0),arr2.getOrDefault(s,0));
        }
        
        //공집합 및 다중집합 크기
        for(String s : arr2.keySet()){
            if(arr1.containsKey(s)){
                answer += Math.min(arr1.get(s),arr2.get(s));
            }
        }
        
        if(interSize == 0) return 65536;
        answer = answer*65536/interSize;
        
        return answer;
    }   

}

[풀이]

 

교집합 , 합집합 , 둘다 공집합인 경우 , 다중집합을 구해야한다.

우선 substring()을 사용해서 두글자씩 끊어준 뒤 isAlphabetic()을 이용하여 알파벳이 아닌경우 제외하도록 하였다.

 

1. 교집합 : HashMap<>을 2개 선언하여 구하였다. Key를 substring으로 분리된 2글자 , value를 갯수로 정하였다. 

2. 합집합 : 중복이 허용되지않는 HashSet에 2개 집합의 요소를 모두 넣어준다.

3. 공집합 : HashMap에 아무 값도 들어있지 않다면 interSize가 0이 되므로 공집합 즉 1 * 65536을 리턴한다

4. 다중집합 : 예시3번같은 경우를 말한다. 이 경우도 결국은 HashMap에 key의 수가 1개일 뿐 value가 1이상이기 때문에 Math.min()을 사용하면 문제없이 넘어갈 수 있다.

'문제풀이 > 프로그래머스' 카테고리의 다른 글

[JAVA] 둘만의 암호  (1) 2023.02.21
[JAVA] 개인정보 수집 유효기간  (0) 2023.02.21
[JAVA] 프린터  (0) 2023.02.21
[JAVA] 카드 뭉치  (0) 2023.02.20
[JAVA , Lv2] 기능개발  (0) 2023.02.16