mingssssss
https://programmers.co.kr/learn/courses/30/lessons/17677
import java.util.*;
// 자카드 유사도: 두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값.
// 두 집합 모두 공집합일 경우 1로 정의.
class Solution {
static String[] s1;
static String[] s2;
static int s1_size;
static int s2_size;
static ArrayList<String> list1;
static ArrayList<String> list2;
static boolean flag;
public int solution(String str1, String str2) {
double answer = 0;
s1_size = str1.length();
s2_size = str2.length();
s1 = str1.split("");
s2 = str2.split("");
// char c = charAt('F');
// int num = (int)c;
list1 = new ArrayList<>();
list2 = new ArrayList<>();
ArrayList<String> union = new ArrayList<>();
ArrayList<String> intersection = new ArrayList<>();
split_one(s1);
split_two(s2);
// 중복 원소 처리를 위해 두 집합 정렬
Collections.sort(list1);
Collections.sort(list2);
// 교집합 구하기
for(String s : list1) {
if(list2.remove(s)) { // 집합1에 집합2가 포함된다면 삭제후, 교집합에 추가
intersection.add(s);
}
union.add(s);
}
// 합집합 구하기
for(String s : list2) { // 교집합에서 제외된 것 뺀 나머지 합집합에 추가
union.add(s);
}
double a = intersection.size();
double b = union.size();
double jakard = 0;
if(union.size() == 0)
jakard = 1; // 공집합일 경우 1
else
jakard = (double) intersection.size() / (double) union.size();
return (int) (jakard * 65536);
}
private static void split_one(String[] s) {
String temp = "";
flag = false;
for (int i = 0; i < s1_size; i++) {
// System.out.println(i + " idx");
if ((int)s[i].charAt(0) < 65 || ((int)s[i].charAt(0) > 90 && (int)s[i].charAt(0) < 97) ||(int)s[i].charAt(0) > 127) {
flag = true;
continue;
}
temp += s[i].toUpperCase();
System.out.println(temp + " temp");
if (temp.length() == 2 && flag == true) {
temp = "";
flag = false;
i--;
continue;
}
if (temp.length() == 2) {
list1.add(temp);
temp = "";
i--;
}
}
}
private static void split_two(String[] s) {
String temp = "";
flag = false;
for (int i = 0; i < s2_size; i++) {
if ((int)s[i].charAt(0) < 65 || ((int)s[i].charAt(0) > 90 && (int)s[i].charAt(0) < 97) ||(int)s[i].charAt(0) > 127) {
flag = true;
continue;
}
temp += s[i].toUpperCase();
// System.out.println(temp + " temp");
if (temp.length() == 2 && flag == true) {
temp = "";
flag = false;
i--;
continue;
}
if (temp.length() == 2) {
list2.add(temp);
temp = "";
i--;
}
}
}
}
스킬 체크 2단계를 계속 도전하고 있는데, 2단계에서 첫 번째 문제도
못 풀고 있다... 매번 새로운 내용이라 꼭꼭 정리하고 넘어가고 있다.
문제가 길어 힘들 거 같았지만, 문제 자체는 쉬운 내용이었다.
2글자로 잘라야 하는데, 무조건 2글자씩 겹쳐서 자르되, 공백이나 특수문자가
섞여있으면 그 부분을 통째로 날려버리고 그 다음부터 또 2개씩 자른다.
자른 문자들을 중복 체크하기위해 sort해서 for문을 돌린다.
리스트에서 값을 하나씩 꺼내와서 체크한다
// 교집합 구하기
for(String s : list1) {
if(list2.remove(s)) { // 집합1에 집합2가 포함된다면 삭제후, 교집합에 추가
intersection.add(s);
}
union.add(s);
}
// 합집합 구하기
for(String s : list2) { // 교집합에서 제외된 것 뺀 나머지 합집합에 추가
union.add(s);
}
double a = intersection.size();
double b = union.size();
(출처: https://minhamina.tistory.com/108)
첫 번째 if문의 조건의 뜻은, '만약 list2에 s를 remove 할 수 있다면'
라는 뜻이다. 그때 intersection 리스트에 값을 추가해주고,
합집합은 공통이니 union 리스트에도 값을 추가해준다.
그리고 합집합은 교집합에서 제외된 값을 뺀 나머지 값을 추가해주면 된다.
이 문제에서 교집합, 합집합을 다루는 법을 익혔으며, 정규식으로도 많이들 푸셨는데
그 부분도 확인해보고, 함수나 코드를 좀 더 깔끔하게 정리할 수 있도록
노력해야겠다.