본문 바로가기
알고리즘

[프로그래머스/17677] [1차] 뉴스 클러스터링

by 물고기고기 2023. 12. 7.

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

 

프로그래머스

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

programmers.co.kr

문제 자체는 단순 구현문제라 그리 어렵지 않았는데 집합의 특성상 어떤 데이터타입으로 구현하느냐에서 많이 헷갈렸다.

 

풀기전 아이디어 스케치

처음엔 집합이라 말그대로 Str1과 Str2을 HashSet을 사용해 풀려고했는데 다시 찬찬히 읽어보니 다중집합도 허용한대서 요소끼리 중복도 허용되는 데이터타입을 사용해야했다. 그래서 list를 사용해야하나?했으나 각각의 요소가 몇개 있는지 알아야한다는걸 이후 로직을 구현하면서 깨달았다. 

예를 들어 FE가 두개라면 FE:2 이런식으로 데이터를 구현해야하니 이건 hashtable로 구현해야한다.

 

풀이

코드 자체는 위의 아이디어 스케치를 기반으로 그대로 따라 구현한 것이다. 효율적인 코드는 아닌 것같다. (교집합과 합집합 구하는 부분에서 두번 연산을하니..)

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        
        // 1. str1과 str2를 hashtable로 만들기
        Hashtable<String,Integer> str1table = new Hashtable<>();
        Hashtable<String,Integer> str2table = new Hashtable<>();
        
        for(int i=0; i<str1.length()-1; i++){
            // 첫 번째 글자와 두 번째 글자 분리
            String firstChar = str1.substring(i,i+1).toLowerCase();
            String secondChar = str1.substring(i+1,i+2).toLowerCase();

            // 각 글자 확인
            if (firstChar.compareTo("a") < 0 || firstChar.compareTo("z") > 0 
                || secondChar.compareTo("a") < 0 || secondChar.compareTo("z") > 0) {
                // System.out.println("a와 z사이의 값이 아님"+firstChar+secondChar);
            }else{
                String ext = str1.substring(i,i+2).toLowerCase();
                if(str1table.containsKey(ext) == true){
                    str1table.put(ext,str1table.get(ext)+1);   
                }else{
                    str1table.put(ext,1);
                }
            }
        }
        
        for(int j=0; j<str2.length()-1; j++){
            String firstChar = str2.substring(j,j+1).toLowerCase();
            String secondChar = str2.substring(j+1,j+2).toLowerCase();

            if (firstChar.compareTo("a") < 0 || firstChar.compareTo("z") > 0 
                || secondChar.compareTo("a") < 0 || secondChar.compareTo("z") > 0) {
                // System.out.println("a와 z사이의 값이 아님"+firstChar+secondChar);
            }else{
                String ext = str2.substring(j,j+2).toLowerCase();
                if(str2table.containsKey(ext) == true){
                    str2table.put(ext,str2table.get(ext)+1);   
                }else{
                    str2table.put(ext,1);
                }
            }
        }
        
//         for (String key : str1table.keySet()) {
//             System.out.println("Key1: " + key + ", Value: " + str1table.get(key));
//         }
        
//         for (String key : str2table.keySet()) {
//             System.out.println("Key2: " + key + ", Value: " + str2table.get(key));
//         }
        
        // 2. 교집합과 합집합 구하기 str1table, str2table
        Hashtable<String,Integer> mintable = new Hashtable<>();
        Hashtable<String,Integer> maxtable = new Hashtable<>();
        
        for (String key : str1table.keySet()) {
            // 교집합
            if(str2table.containsKey(key) == true){
                mintable.put(key,Math.min(str1table.get(key),str2table.get(key)));
            }
            // 교집합을 구하면서 str1table에 있는걸 합집합으로 옮기고
            maxtable.put(key,str1table.get(key));
        }
        
        for (String key : str2table.keySet()) {
            // 합집합
            if(maxtable.containsKey(key) == true){
                // 합집합에 존재하는 값과 str2table를 비교해 더 큰 값을 넣어 합집합을 늘림
                maxtable.put(key,Math.max(maxtable.get(key),str2table.get(key)));
            }else{
                maxtable.put(key,str2table.get(key));
            }
        }
        
        // for (String key : mintable.keySet()) {
        //     System.out.println("Key: " + key + ", Value: " + mintable.get(key));
        // }
        
        // 3. 교집합과 합집합의 value값을 전부 합산
        int min = 0;
        int max = 0;
        
        for (String key : mintable.keySet()) {
            min += mintable.get(key);
        }
        
        for (String key : maxtable.keySet()) {
            max += maxtable.get(key);
        }
        
        // System.out.println("min"+min+"max"+max);
        
        // 4. value값 계산
        
        if(max == 0){
            return 65536;
        }else{
            // float result = min/max * 65536;
            return (int) (((double) min /(double) max) * 65536);
        }
    }
}

 

일단은 통과

댓글