코테 문제풀이 4일차

아빠는 외계연·2022년 12월 23일
0

CodingTest

목록 보기
5/18

👑문제: [프로그래머스 Level2]

뉴스 클러스터링

풀이 시 고려해야 할 점

중복 집합일 경우에 합집합을 구하는 것이 어려움이 있었다.
ex) {11,11,11,11} + {11,11} = {11,11,11,11}
집합 자체가 중복을 허용하므로 set은 사용하면 안되고, map으로 횟수를 세서 직접 합집합을 구해서 풀었다.

풀이 과정

static public boolean check(String str) {
        if(Character.isAlphabetic(str.charAt(0)) && Character.isAlphabetic(str.charAt(1))) return true;
        return false;
    }

    static public int solution(String str1, String str2) {
        HashMap<String,Integer> arr1 = new HashMap<>();
        HashMap<String,Integer> arr2 = new HashMap<>();

        for (int i = 0; i < str1.length()-1; i++) {
            String newString = str1.substring(i,i+2);
            if(check(newString)) {
                arr1.put(newString.toLowerCase(),arr1.getOrDefault(newString.toLowerCase(), 0) + 1);
            }
        }

        for (int i = 0; i < str2.length()-1; i++) {
            String newString = str2.substring(i,i+2);
            if(check(newString)) {
                arr2.put(newString.toLowerCase(),arr2.getOrDefault(newString.toLowerCase(), 0) + 1);
            }
        }


        if(arr1.size() == 0 && arr2.size() == 0) return 65536;

        Iterator<String> it1 = arr1.keySet().iterator();
        Iterator<String> it2 = arr2.keySet().iterator();
        int addNum = 0, subNum = 0; // 교집합 합집합
        while(it1.hasNext()) {
            String key = it1.next();
            if(arr2.containsKey(key)) {
                addNum += Math.min(arr1.get(key),arr2.get(key));
                subNum += Math.max(arr1.get(key),arr2.get(key));
            } else {
                subNum += arr1.get(key);
            }
        }

        while(it2.hasNext()) {
            String key = it2.next();
            if(arr1.containsKey(key)) {
                continue;
            } else {
                subNum += arr2.get(key);
            }
        }
        return (int)((double)addNum/subNum*65536);

    }

느낀점

map.put(key,map.getOrDefault(key, 0) + 1);
-> 이 표현 기억하기!!
key가 없으면 0을 반환, 있으면 해당 값을 반환

character가 알파벳임을 알아내고 싶을 때는 Character.isAlphabetic함수 사용!!
처음에 'A' <= character <='z'로 하면 알파벳이 검증되는 줄 알았는데,,
웬걸,, 사이에 저런 특수기호들이 있었다ㅎㅎ
확실히 검증한다음에 사용하기!

profile
Backend Developer

0개의 댓글