프로그래머스(Java) - 뉴스 클러스터링

민지킴·2021년 4월 4일
0

프로그래머스

목록 보기
10/42
post-thumbnail

문제 링크

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

문제 풀이

str1.charAt(i)>=65 && str1.charAt(i)<=90) || (str1.charAt(i)>=97 && str1.charAt(i)<=122

해당 조건을 통해서 영어 소문자, 대문자인 경우에만
임시 문자열인 temp에 담아 줄수 있도록 했고 그 외에 경우에는 문자열에 포함되면 안되므로
temp를 초기화해주었다.

2단어씩 끊어서 단어를 만들어야하므로 temp의 길이가 2가 된경우에는 list에 넣어주고 substring을 이용해서 맨 앞글자를 잘랐다.

        int gyo = 0;
        for(int i=0; i<alist.size(); i++){
            for(int j=0; j<blist.size(); j++){
                if(blist.get(j).equalsIgnoreCase(alist.get(i))){
                    gyo++;
                    blist.remove(j);
                    break;
                }
            }
        }

        int hap = alist.size()+blist.size();

alist와 blist를 비교해서 대소문자를 무시한 비교(equalsIgnoreCase)를 한뒤에 같은 단어가 있을경우 둘의 공통부분인 것의 개수인(교집합) gyo에 +1을해주고, blist에서 해당 값을 제거했다.
그렇게 되면 둘의 합집합은 alist+blist를 해주게 되면 둘의 공통부분은 없기 때문에 둘의 합으로 구할 수 있게 된다.

두개가 공집합인 경우에는 65536을 그대로 return 하고 아닌 경우에는

double score = (double)(gyo)/(double)(hap) * 65536;
        answer = (int)Math.floor(score);

를 사용해서 구하였다.

코드

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        
        
        List<String>alist = new ArrayList<>();
        List<String>blist = new ArrayList<>();
        String temp = "";
        for(int i=0; i<str1.length(); i++){
            
            if( (str1.charAt(i)>=65 && str1.charAt(i)<=90) || (str1.charAt(i)>=97 && str1.charAt(i)<=122)){
                temp+=str1.substring(i,i+1);
            }else{
                temp = "";
            } 
            
            if(temp.length()==2){
                alist.add(temp);   
                temp=temp.substring(1,2);
            } 
        }
        
        temp="";
        for(int i=0; i<str2.length(); i++){
            if( (str2.charAt(i)>=65 && str2.charAt(i)<=90) || (str2.charAt(i)>=97 && str2.charAt(i)<=122)){
                temp+=str2.substring(i,i+1);
            }else{
                temp = "";
            } 
            
            if(temp.length()==2){
                blist.add(temp);   
                temp=temp.substring(1,2);
            }   
        }
        
        int gyo = 0;
        for(int i=0; i<alist.size(); i++){
            for(int j=0; j<blist.size(); j++){
                if(blist.get(j).equalsIgnoreCase(alist.get(i))){
                    gyo++;
                    blist.remove(j);
                    break;
                }
            }
        }

        int hap = alist.size()+blist.size();

        if(alist.size()==0 && blist.size()==0){
            return 65536;
        }
        
        double score = (double)(gyo)/(double)(hap) * 65536;
        answer = (int)Math.floor(score);

        return answer;
    }
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글