programmers.co.kr/learn/courses/30/lessons/17677
문자열 두개를 소문자로 바꾸고 정규식을 이용해서 소문자 알파벳으로 이루어진 키만 map에 등록합니다.
첫번째 문자열의 map을 순회하면서 두번째 문자열에
key값에 포함되면 교집합 count + 1를 해주고 합집합에는 해당 키값의 value값을 더 작은 값으로 만들어줍니다.
포함되지 않으면 합집합에 추가 해줍니다.
이후 합집합 map을 순회하면서 개수를 카운트한 뒤 값을 구해줍니다.
주의할점으로 int값으로 처리했기때문에 2/8 같은 경우 0이 됩니다. 그래서 double을 사용하시거나 곱하는 값을 먼저 한뒤 나눠주거나 해야합니다.
import java.util.HashMap;
import java.util.Map;
class Solution {
static final int MUL = 65536;
public int solution(String str1, String str2) {
Map<String, Integer> str1Map = new HashMap<>();
Map<String, Integer> str2Map = new HashMap<>();
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
for (int i = 0; i < str1.length() - 1; i++) {
String key = "";
key += str1.charAt(i);
key += str1.charAt(i + 1);
if(key.matches("^[a-z]*$")) {
str1Map.put(key, str1Map.getOrDefault(key, 0) + 1);
}
}
for (int i = 0; i < str2.length() - 1; i++) {
String key = "";
key += str2.charAt(i);
key += str2.charAt(i + 1);
if(key.matches("^[a-z]*$")) {
str2Map.put(key, str2Map.getOrDefault(key, 0) + 1);
}
}
int sub = 0;
Map<String, Integer> sumMap = new HashMap<>(str2Map);
for (String s : str1Map.keySet()) {
if(str2Map.containsKey(s)) {
sub += Math.min(str1Map.get(s), str2Map.get(s));
sumMap.put(s, Math.max(str1Map.get(s), str2Map.get(s)));
}else {
sumMap.put(s, str1Map.get(s));
}
}
int sum = 0;
for (String s : sumMap.keySet()) {
sum += sumMap.get(s);
}
if(sum == 0) {
return MUL;
}
return sub * MUL / sum;
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 캐쉬 문제 (자바) (0) | 2021.04.03 |
---|---|
프로그래머스 - N진수 게임 문제 (자바) (0) | 2021.04.02 |
프로그래머스 - 다음 큰 숫자 (자바) (0) | 2021.03.30 |
프로그래머스 수식 최대화 문제 (자바) (0) | 2021.03.30 |
프로그래머스 - 퀴드압축 후 개수 세기 문제 (자바) (0) | 2021.03.30 |