티스토리 뷰

728x90

전체적으로 구현력을 보는 간단한 문제였다.

 

이 문제의 가장 핵심은 중복 요소를 어떻게 다루느냐였는데

중복은 허용하되 중복에 대한 카운트가 잘 되어야 하므로 Map 구조를 사용했고

 

전체 합집합에는 교집합에 대한 카운트가 2번 되어있으므로

교집합을 한 번 제거해주는 과정이 필수이다.

 

이 중복 체크만 잘 해준다면 쉽게 구현할 수 있는 문제라고 생각한다.

 


2022-08-15 풀이 추가

import java.util.*;
import java.util.regex.Pattern;

class Solution {
    Map<String, Integer> map1 = new HashMap<>();
    Map<String, Integer> map2 = new HashMap<>();
    int inter, union;
    
    void helper(String str, Map<String, Integer> map) {
        var length = str.length();
        
        for (var i = 0; i < length - 1; i++) {
            var temp = str.substring(i, i + 2);
            if (Pattern.matches("^[a-z]*$", temp)) {
                map.put(temp, map.getOrDefault(temp, 0) + 1);
                union++;
            }
        }
    }
    
    public int solution(String str1, String str2) {
        int answer = 0;
        
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        
        helper(str1, map1);
        helper(str2, map2);
        
        for (var str : map1.keySet()) {
            if (map2.containsKey(str)) {
                inter += Math.min(map1.get(str), map2.get(str));
            }
        }
        union -= inter;
        if (union == 0) return 65536;
        answer = (int) (((double)inter / union) * 65536);
        return answer;
    }
}

 


import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();

        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        int length = 0;
        int count = 0;
        
        for (int i = 0; i < str1.length() - 1; i++) {
            String s = str1.substring(i, i + 2);
            if (s.charAt(0) >= 'a' && s.charAt(0) <= 'z' && s.charAt(1) >= 'a' && s.charAt(1) <= 'z') {
                map1.put(s, map1.getOrDefault(s, 0) + 1);
                length++;
            }
        }
        for (int i = 0; i < str2.length() - 1; i++) {
            String s = str2.substring(i, i + 2);
            if (s.charAt(0) >= 'a' && s.charAt(0) <= 'z' && s.charAt(1) >= 'a' && s.charAt(1) <= 'z') {
                map2.put(s, map2.getOrDefault(s, 0) + 1);
                length++;
            }
        }
        for (String s : map1.keySet()) {
            if (map2.get(s) == null) continue;
            count += Math.min(map1.get(s), map2.get(s));
        }

        if (length - count == 0) return 65536;
        double answer = ((double)count / (length - count)) * 65536;

        return (int) answer;
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함