코테/lvl2

프로그래머스 뉴스 클러스터링(lvl2) 풀어보기

디비드킴 2026. 9. 12. 16:29

문제링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 핵심

-문제가 너무 길다 생략


문제 풀이법

-각각 스트링을 두개씩 쪼갠다

쪼개면서 알파벳이 아닌것이 1글자라도 포함되면 

그 두글자는 맵에 저장하지않는다 맵에는 해당 동일두글자가

몇번씩 있는지 체크해서 넣는다

교집합을 확인한다 

합집합을 확인한다


코드

public static int solution(String str1, String str2) {
        int answer = 0;

        int maxLength = Math.max(str1.length(), str2.length());

        Map<String, Integer> map1 = new LinkedHashMap<>();
        Map<String, Integer> map2 = new LinkedHashMap<>();

        for (int i = 0; i < maxLength - 1; i++) {
            if (i < str1.length() - 1) {
                String s1 = str1.substring(i, i + 2).toLowerCase();
                if (s1.charAt(0) >= 'a' && s1.charAt(0) <= 'z' &&
                        s1.charAt(1) >= 'a' && s1.charAt(1) <= 'z') {

                    map1.put(s1, map1.getOrDefault(s1, 0) + 1);
                }
            }
            if (i < str2.length() - 1) {
                String s2 = str2.substring(i, i + 2).toLowerCase();
                if (s2.charAt(0) >= 'a' && s2.charAt(0) <= 'z' &&
                        s2.charAt(1) >= 'a' && s2.charAt(1) <= 'z') {
                    map2.put(s2, map2.getOrDefault(s2, 0) + 1);
                }
            }
        }
        System.out.println(map1);
        System.out.println(map2);
        int go = 0;
        int hap = 0;
        List<String>temp=new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map1.entrySet()) {
            String key = entry.getKey();
            if (map2.containsKey(key)) {
                go += Math.min(entry.getValue(), map2.get(key));
                hap += Math.max(entry.getValue(), map2.get(key));
                map2.remove(key);
            }else{
                temp.add(key);
            }
        }
        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            hap += entry.getValue();
        }
        for(String t: temp){
             hap +=map1.get(t);
        }

        System.out.println(go + "," + hap);
        double t=(double) go / hap;
        if(hap==0&&go==0){
            t=1;
        }
        answer = (int) (t * 65536);
        System.out.println(answer);
        return answer;
    }

 


결과



gpt피드백

-List<String> temp = new ArrayList<>();

 

도 사실 없어도 돼. 합집합은 더 간단하게 계산 가능해.

네가 이미 go를 구했잖아. 그러면 다중집합에서도:

합집합 크기 = map1 전체 원소 수 + map2 전체 원소 수 - 교집합 크기
 

가 그대로 성립해.네 풀이는 정답이고 아이디어도 맞는데, 합집합 계산 부분을 훨씬 줄일 수 있다가 핵심 개선점이야.

 
 
 

배운점과느낀점

-아니 문제가 길어서 힘들다

교집합 /합집합 규칙이 헷갈려서 약간 헤맸다