https://school.programmers.co.kr/learn/courses/30/lessons/17677
1. Map.Entry, 정규식 이용
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
HashMap<String, Integer> m1 = new HashMap<String, Integer>();
HashMap<String, Integer> m2 = new HashMap<String, Integer>();
for(int i=0; i<str1.length()-1; i++){
String tmp = str1.substring(i,i+2).toLowerCase();
if(!tmp.matches("^[a-zA-Z]*$"))
continue;
if(m1.containsKey(tmp)){
m1.put(tmp, m1.get(tmp)+1);
}
else{
m1.put(tmp, 1);
}
}
for(int i=0; i<str2.length()-1; i++){
String tmp = str2.substring(i,i+2).toLowerCase();
if(!tmp.matches("^[a-zA-Z]*$"))
continue;
if(m2.containsKey(tmp)){
m2.put(tmp, m2.get(tmp)+1);
}
else{
m2.put(tmp, 1);
}
}
int a=0, b=0; // 교집합, 합집합
for(Map.Entry<String, Integer> m : m1.entrySet()){
if(m2.containsKey(m.getKey())){
a+=Math.min(m2.get(m.getKey()), m.getValue());
b+=Math.max(m2.get(m.getKey()), m.getValue());
}
else{
b+=m.getValue();
}
}
for(Map.Entry<String, Integer> m : m2.entrySet()){
if(!m1.containsKey(m.getKey())){
b+=m.getValue();
}
}
if(a==0&&b==0)
answer = 65536;
else{
answer = (int)Math.floor((((double)a)/((double)b))*65536);
}
return answer;
}
}
2. 다른풀이에서 stream을 너무 잘쓴 코드가 있어서 두고두고 볼라고... 문제되면 삭제
private Map<String, Long> group(String word) {
return IntStream.range(0, word.length() - 1)
.mapToObj(index -> word.substring(index, index + 2))
.filter(text -> text.chars().allMatch(character -> Character.isAlphabetic((char) character)))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
private Integer getIntersection(Map<String, Long> words1, Map<String, Long> words2) {
return words1.entrySet().stream()
.filter(entry -> words2.containsKey(entry.getKey()))
.map(entry -> Math.min(entry.getValue(), words2.get(entry.getKey())))
.mapToInt(Long::intValue)
.sum();
}
private Integer getUnion(Map<String, Long> words1, Map<String, Long> words2) {
Map<String, Long> copiedWords = new HashMap<>(words2);
words1.forEach((key, value) -> copiedWords.put(key, Math.max(value, words2.getOrDefault(key, 0L))));
return copiedWords.values().stream()
.mapToInt(Long::intValue)
.sum();
}
'알고리즘 > 알고리즘' 카테고리의 다른 글
[C++] 프로그래머스 : 롤케이크 자르기 (0) | 2022.10.29 |
---|---|
[C++] 프로그래머스 : 야간 전술보행 (0) | 2022.10.29 |
[JAVA] 프로그래머스 : 행렬 테두리 회전하기 (0) | 2022.08.02 |
[JAVA] 프로그래머스 : 신규 아이디 추천 (0) | 2022.08.01 |
[JAVA] 프로그래머스 : 로또의 최고 순위와 최저 순위 (0) | 2022.08.01 |