🔗 문제 링크
[프로그래머스] 뉴스 클러스터링 / 2018 KAKAO BLIND RECRUITMENT(1차)
📝 풀이 과정
집합을 만들어 교집합과 합집합을 조사해야 하는데, 같은 원소가 여러번 등장할 수 있고 자주 찾아 반환해주어야 하기 때문에 HashMap
자료구조를 사용하기로 했다.
집합에 대소문자 구분은 없으므로 String.toLowerCase()
를 사용해 모든 문자열을 소문자로 변경해주었다. 첫번째 문자열을 모두 끊어 Map에 넣어준뒤 두번째 문자열 반복을 돌며 해당 문자열이 존재하면 교집합 개수를 증가시켜주는 방식을 사용해 교집합과 합집합의 수를 세어주었다.
if (!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1))) {
continue;
}
String key = str1.substring(i, i + 2);
map.put(key, map.getOrDefault(key, 0) + 1);
첫번째 문자열에서 문자를 모두 2개씩 끊어 map에 <원소, 원소가 등장한 횟수>
로 저장하기로 했다. 만약 하나라도 알파벳이 아니라면 continue
를 통해 건너 뛰어주었고, 아니라면 map에 추가했다.
if (map.containsKey(key)) {
if (map.put(key, map.get(key) - 1) == 1) {
map.remove(key);
interCnt++;
}
unionCnt++;
}
다시 비슷한 방식으로 두 번째 문자열을 끊어주었는데, 만약 key
가 Map에 포함되어있다면 첫번째 문자열에도 존재했던 key이므로 interCnt를 증가시켜주었고, 아니라면 unionCnt만 증가시켜주었다.
최종적으로 map에 남은 숫자를 unionCnt에 더해주고, unionCnt가 0이라면 65536를 반환하고 아니라면 계산값을 반환해주면 된다.
💻 코드
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static int MULTI = 65536;
public int solution(String str1, String str2) {
Map<String, Integer> map = new HashMap<>();
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
for (int i = 0; i < str1.length() - 1; i++) {
if (!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1)))
continue;
String key = str1.substring(i, i + 2);
map.put(key, map.getOrDefault(key, 0) + 1);
}
int interCnt = 0, unionCnt = 0;
for (int i = 0; i < str2.length() - 1; i++) {
if (!Character.isAlphabetic(str2.charAt(i)) || !Character.isAlphabetic(str2.charAt(i + 1)))
continue;
String key = str2.substring(i, i + 2);
if (map.containsKey(key)) {
if (map.put(key, map.get(key) - 1) == 1)
map.remove(key);
interCnt++;
}
unionCnt++;
}
for (String key : map.keySet())
unionCnt += map.get(key);
return unionCnt == 0 ? MULTI : (int) (((double) interCnt / unionCnt) * MULTI);
}
}
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 캐시 / 2018 KAKAO BLIND RECRUITMENT(1차) - JAVA (0) | 2021.01.14 |
---|---|
[프로그래머스] 프렌즈4블록 / 2018 KAKAO BLIND RECRUITMENT(1차) - JAVA (0) | 2021.01.11 |
[프로그래머스] 기능개발 - JAVA (0) | 2021.01.03 |
[프로그래머스] 다리를 지나는 트럭 - JAVA (1) | 2021.01.03 |
[프로그래머스] 베스트앨범 - JAVA (0) | 2021.01.02 |