-
728x90
전체 코드는 맨 밑에 있습니다.
[ 문제 풀이 ]
1. str1, str2를 모두 소문자로 바꾼다.
- 다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. "AB"와 "Ab", "ab"는 같은 원소로 취급한다.
2. str1 를 2개씩 자른 원소와 등장 횟수를 HashMap인, jacard1에 저장한다.
=> 알파벳이 아닌 다른 문자가 포함되어있으면, 버린다.- 영문자로 된 글자 쌍만 유효하고, 기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.
3. str2 를 2개씩 자른 원소와 등장 횟수를 HashMap인, jacard2에 저장한다.
=> 알파벳이 아닌 다른 문자가 포함되어있으면, 버린다.4. str2의 원소가 str1에 있으면, 교집합이므로 str1의 개수를 감소시킨다.
=> 이때 감소시킨 횟수가 min, 공집합의 개수이다.
5. jacard1과 jacard2에 남은 원소들의 합을 모두 더하면, 합집합의 개수가 된다.
6. 자카드 유사도 = 65536 * min / max
단, max(합집합 수)가 0이면, 두 집합이 공집합인 것이므로 1에 65536을 곱한 65536을 리턴한다.- 집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의
[ 전체 코드 ]
import java.util.HashMap;class Solution {static HashMap<String, Integer> jacard1, jacard2;public static int solution(String str1, String str2) {int min = 0, max = 0;jacard1 = new HashMap<String, Integer>();jacard2 = new HashMap<String, Integer>();str1 = str1.toLowerCase();str2 = str2.toLowerCase();// str1 : 두개씩 자르기for (int i = 0; i < str1.length() - 1; i++) {if (!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1)))continue;String str = str1.substring(i, i + 2);jacard1.put(str, jacard1.containsKey(str) ? jacard1.get(str) + 1 : 1);}// str2 : 두개씩 자르기for (int i = 0; i < str2.length() - 1; i++) {if (!Character.isAlphabetic(str2.charAt(i)) || !Character.isAlphabetic(str2.charAt(i + 1)))continue;String str = str2.substring(i, i + 2);jacard2.put(str, jacard2.containsKey(str) ? jacard2.get(str) + 1 : 1);max++;if (jacard1.containsKey(str) && jacard1.get(str) > 0) {jacard1.put(str, jacard1.get(str) - 1);min++;}}// str1에서 살아남은 수 max에 추가for (String s : jacard1.keySet())if (jacard1.get(s) > 0)max += jacard1.get(s);return max == 0 ? 65536 : 65536 * min / max;}}틀린 것이나 질문이 있으면
댓글 부탁드려요 :)데롱디롱희희.. (๑′ᴗ‵๑)
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[level2] 프로그래머스 - 튜플(JAVA) (0) 2021.09.10 [level2] 프로그래머스 - 수식 최대화(JAVA) (0) 2021.09.10 [level2] 프로그래머스 - 거리두기 확인하기(JAVA) (1) 2021.09.09 [level2] 프로그래머스 - 괄호 변환(JAVA) (0) 2021.09.09 [level2] 프로그래머스 - 메뉴 리뉴얼(JAVA) (3) 2021.09.09