[프로그래머스] 카카오_뉴스 클러스터링 (자바 풀이)
- 알고리즘 문제 해결(PS)/[프로그래머스]
- 2022. 1. 25.
문제
https://programmers.co.kr/learn/courses/30/lessons/17677?language=java
풀이
이 문제는 정규표현식에 대해 알면 편하다. 우선 두 String의 문자열들을 추출해야 하는데, String의 처음부터 두 글자씩 끊어서 이것이 영문자로만 이루어져 있다면 HashMap 자료구조에 넣어준다. 여기서 영문자로만 이루어져 있는지 판단하는 것은 정규표현식을 이용할 수 있다. 만약 HashMap에 이미 값이 존재하면 value를 1 증가시키고 없다면 1로 만들어준다.
이렇게 모든 문자열 집합을 구했다면, 교집합과 합집합을 구하면된다.
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import java.util.*; import java.util.regex.Pattern; class Solution { public int solution(String str1, String str2) { int answer = 0; Map<String, Integer> m1 = new HashMap<>(); Map<String, Integer> m2 = new HashMap<>(); str1 = str1.toUpperCase(); str2 = str2.toUpperCase(); getPair(str1, m1); getPair(str2, m2); double diff = 0; double sum = 0; /* count */ for(String key1 : m1.keySet()){ if(m2.containsKey(key1)){ diff += Math.min(m1.get(key1), m2.get(key1)); sum += Math.max(m1.get(key1), m2.get(key1)); m2.remove(key1); }else{ sum += m1.get(key1); } } for(String key2 : m2.keySet()){ sum += m2.get(key2); } if(diff == 0.0 && sum == 0.0){ // 둘 다 0이면 answer = 65536; }else{ answer = (int)((diff/sum)*65536); } return answer; } /* 문자열 추출하기 */ public static void getPair(String str, Map<String, Integer> m){ String pattern = "^[A-Z]*$"; // 영문자 정규표현식 for(int i=0; i<str.length()-1; i++){ String tmp = ""; tmp += str.charAt(i); tmp += str.charAt(i+1); if(Pattern.matches(pattern, tmp)){ // 영문자인 경우만 m.compute(tmp, (k,v) -> (v==null) ? 1 : v+1 ); } } } } | cs |
결과
반응형
'알고리즘 문제 해결(PS) > [프로그래머스]' 카테고리의 다른 글
[프로그래머스] 카카오_추석 트래픽 (자바 풀이) (0) | 2022.01.25 |
---|---|
[프로그래머스] 카카오_셔틀버스 (자바 풀이) (0) | 2022.01.25 |
[프로그래머스] 카카오_프렌즈4블록 (자바 풀이) (0) | 2022.01.24 |
[프로그래머스] 카카오_캐시 (자바 풀이) (0) | 2022.01.24 |
[프로그래스] 카카오_비밀지도 (자바 풀이) (0) | 2022.01.24 |