프로그래머스 Lv.2 2018 KAKO BLIND RECRUITMENT [1차] 뉴스 클러스터링
문자열 2개가 주어졌을 때, 이를 두 글자씩 끊어서 다중집합을 만든다. 이 다중집합을 응용하여 두 문자열 사이의 자카드 유사도를 구한 후 65536을 곱한 값을 return하는 solution함수를 작성하는 문제이다.
대소문자 차이를 무시하기 때문에 문자열을 비교할 때는 equalsIgnoreCase함수를 사용했다. 그 다음, 문자열을 두 글자씩 끊어서 ArrayList에 담아 반환하는 str_to_two함수를 만들어서 주어진 문자열을 다중집합의 원소로 만든다. 만들어진 원소를 비교해서 같다면 해당 원소를 교집합 원소를 담는 ArrayList에 추가하고, 원래 있던 ArrayList에서 삭제하였다. 이 과정을 통해 s1, s2 ArrayList에는 교집합 원소를 제외한 원소만 남겼다.
import java.util.ArrayList;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
if (str1.equalsIgnoreCase(str2))
return 65536;
ArrayList<String> s1 = str_to_two(str1);
ArrayList<String> s2 = str_to_two(str2);
ArrayList<String> intersection = new ArrayList<>();
for (int i = 0; i < s1.size(); i++) {
for (int j = 0; j < s2.size(); j++) {
if (s1.get(i).equalsIgnoreCase(s2.get(j))) {
intersection.add(s1.get(i));
s2.remove(j);
break;
}
}
}
for (int i = 0; i < intersection.size(); i++) {
s1.remove(intersection.get(i));
}
// 유사도 계산
int sum = s1.size() + s2.size() + intersection.size();
double similarity = intersection.size() / (double)sum;
answer = (int)(similarity * 65536);
return answer;
}
private ArrayList<String> str_to_two(String str) {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < str.length()-1; i++) {
String tw = str.substring(i, i + 2);
char first = tw.charAt(0);
char second = tw.charAt(1);
if (first > 64 && first < 91 || first > 96 && first < 123) {
if (second > 64 && second < 91 || second > 96 && second < 123) {
list.add(tw); // A(65) - Z(90), a(97) - z(122) 사이의 알파벳으로 이루어진 문자만 list에 add
}
}
}
return list;
}
}