교집합, 합집합 구하는 문제이다. 대문자, 소문자 구분을 하지 않기 때문에 모두 소문자로 치환을 해주었다. 문자열을 기준으로 문제에서 요하는 하나의 원소(2글자씩 끊기)들을 전부 구해주고 HashMap을 사용하여 해당 원소들의 개수를 세주었다. 물론 알파벳이 아닌 문자가 들어왔을 때는 집합에 추가하지 않는 예외처리 역시 해주었다. 그리고 HashMap을 통해 1번 Map에 있는 원소를 기준으로 2번 Map에 있는지, 둘 다 있다면 교집합이기 때문에 적은 것의 개수를 교집합으로 세주었고다. 합집합의 경우에는 1번과 2번에 동시에 있는 원소라면 큰 원소를 합집합에 더해주고 1번에만 있는 것은 그냥 더해주었다. 그리고 동시에 있는 원소는 1번을 기준으로 체크하면서 2번에서 삭제하였다. 그래서 마지막에 2번에 남은 것들은 2번에만 있는 것이기 때문에 그냥 다 더해주었다.
코드 전문은 다음과 같다.
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
String temp = new String();
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
ArrayList<String> str1Set = new ArrayList<String>();
ArrayList<String> str2Set = new ArrayList<String>();
HashMap<String, Integer> str1Map = new HashMap<>();
HashMap<String, Integer> str2Map = new HashMap<>();
// str1 파싱
for(int i = 0; i < str1.length()-1; i++) {
temp = str1.substring(i,i+2);
if(temp.charAt(0)>='a' && temp.charAt(0)<='z' && temp.charAt(1)>='a' && temp.charAt(1)<='z') {
str1Set.add(temp);
}
}
for(int i = 0; i < str1Set.size(); i++) {
if(str1Map.containsKey(str1Set.get(i))){
str1Map.put(str1Set.get(i),str1Map.get(str1Set.get(i))+1);
}
else {
str1Map.put(str1Set.get(i),1);
}
}
// str2 파싱
for(int i = 0; i < str2.length()-1; i++) {
temp = str2.substring(i,i+2);
if(temp.charAt(0)>='a' && temp.charAt(0)<='z' && temp.charAt(1)>='a' && temp.charAt(1)<='z') {
str2Set.add(temp);
}
}
for(int i = 0; i < str2Set.size(); i++) {
if(str2Map.containsKey(str2Set.get(i))){
str2Map.put(str2Set.get(i),str2Map.get(str2Set.get(i))+1);
}
else {
str2Map.put(str2Set.get(i),1);
}
}
Set<String> str1Key = str1Map.keySet();
Set<String> str2Key = str2Map.keySet();
int union = 0;
int plus = 0;
// 교집합
for(String key: str1Key) {
if(str2Map.containsKey(key)) {
if(str1Map.get(key)<str2Map.get(key)) {
union += str1Map.get(key);
}
else {
union += str2Map.get(key);
}
}
}
// 합집합
for(String key: str1Key) {
if(str2Map.containsKey(key)) {
if(str1Map.get(key)<str2Map.get(key)) {
plus += str2Map.get(key);
}
else {
plus += str1Map.get(key);
}
str2Map.remove(key);
}
else {
plus += str1Map.get(key);
}
}
for(String key: str2Key) {
plus += str2Map.get(key);
}
double rate = (double) union/plus * 65536;
answer = (int)rate;
if(plus == 0) {
answer = 65536;
}
return answer;
}
}
댓글