하루에 한 문제

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 뉴스 클러스터링 -Java 본문

알고리즘/프로그래머스 lv2 다시풀기

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 뉴스 클러스터링 -Java

dkwjdi 2021. 3. 14. 23:41

https://programmers.co.kr/learn/courses/30/lessons/17677

 

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

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

programmers.co.kr

import java.util.HashMap;
class Solution {
	    public int solution(String str1, String str2) {
	        float answer = 0;
	        
	        //둘다 대문자로 변환 
	        str1=str1.toUpperCase();
	        str2=str2.toUpperCase();
	        
	        if(str1.contentEquals(str2)) return 65536;
	        
	        HashMap<String, Integer> hm1= new HashMap<>();
	        HashMap<String, Integer> hm2= new HashMap<>();
	        
	        slice(hm1, str1);
	        slice(hm2, str2);
	        
	        
	        float interSection=CalIntersection(hm1,hm2); //교집
	        float union=calUnion(hm1,hm2)-interSection; //합집
	        
	        answer=interSection/union;
	        
	        return (int)(answer*65536);
	    }


		private float calUnion(HashMap<String, Integer> hm1, HashMap<String, Integer> hm2) {
			int sum=0;
			for(String s: hm1.keySet()) {
				sum+=hm1.get(s);
			}
			for(String s: hm2.keySet()) {
				sum+=hm2.get(s);
			}
			return sum;
		}


		private int CalIntersection(HashMap<String, Integer> hm1, HashMap<String, Integer> hm2) {
			int sum=0;
			for(String str : hm1.keySet()) {
				if(hm2.containsKey(str)) { //만약 hm2에도 존재한다면 
					sum+=Math.min(hm1.get(str), hm2.get(str));
				}
			}
			return sum;
		}
		

		private void slice(HashMap<String, Integer> hm, String str) {
			for(int i=0; i<str.length()-1; i++) {
				char ch[]= {str.charAt(i), str.charAt(i+1)};
				if(isAlphabet(ch[0]) && isAlphabet(ch[1])) {
					String s=String.valueOf(ch);
					if(hm.containsKey(s)) hm.put(s, hm.get(s)+1); //이미 있으면 +1					
					else hm.put(s, 1); //없다면 1넣어서 삽입
				}
			}
			// TODO Auto-generated method stub
			
		}

		private boolean isAlphabet(char ch) {
			if(ch>=65 && ch<=90) return true;
			return false;
		}
	}

소요시간 : 35분

 

교집합 , 합집합을 구하는 방법은

HashMap에 두글자씩 잘라서 넣습니다. 이 과정에서 공통되는 부분이 있다면 Value값을 1증가시켜 줍니다.

aaaa -> aa aa aa aa -> 'aa'가 4개가 나옵니다. 그렇다면 <'aa', 4> 이런식으로 저장을 해줍니다.

 

그리고 교집합을 구하기 위해서 hm1을 순회하면서 만약 hm2에 같은게 있다면 Math.min으로 작은것을 찾아서 더해줍니다.

 

합집합을 구하기 위해서는 hm1, hm2를 순회하면서 모든 Value값을 더합니다. 그리고 교집합값을 빼줍니다.

 

로직을 살펴보면

 

1. 모든 문자를 대문자로 바꿔준다. (이때 str1과 str2가 같다면 바로 65536을 return해준다)

2. hm1, hm2,에 각각 str1, str2를 잘라서 넣어준다.

3. 교집합, 합집합을 구한다.

4. 교집합/합집합 * 65536 을 반환한다.

 

끝~

Comments