성능 요약
- 메모리: 81.2 MB, 시간: 7.34 ms
구분
- 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT
Answer Code1(2021.02.11)
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
//[1]
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
ArrayList<String> intersection = new ArrayList<>();
ArrayList<String> union = new ArrayList<>();
double jaccard = 0;
//[2]
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
//[3]
for(int i = 0; i < str1.length()-1; i++) {
char first = str1.charAt(i);
char second = str1.charAt(i + 1);
if((first >= 'a' && first <= 'z') && (second >= 'a' && second <= 'z')) {
list1.add(first + "" + second);
}
}
for(int i = 0; i < str2.length()-1; i++) {
char first = str2.charAt(i);
char second = str2.charAt(i + 1);
if((first >= 'a' && first <= 'z') && (second >= 'a' && second <= 'z')) {
list2.add(first + "" + second);
}
}
for(String s : list1) {
if(list2.remove(s)) {
intersection.add(s);
}
union.add(s);
}
for(String s : list2) {
union.add(s);
}
//[4]
if(union.size() == 0) {
jaccard = 1;
} else {
jaccard = (double)intersection.size() / (double)union.size();
}
//[5]
return (int)(jaccard * 65536);
}
}
문제 풀이
-
문제 설명 요약 : 자카드 유사도를 구하는 문제인데, 자카드 유사도의 값은
교집합 / 합집합
이다.-
대소문자를 구분하지 않는다.
-
공집합일 경우에는 값을
1
로 정의한다. -
기타 공백 or 숫자 or 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.
-
-
풀이 순서
-
[1] 두 집합을 연결리스트로 생성한다. 그리고 교집합과 합집합을 담는 연결리스트를 생성한다.
-
[2] 두 문자열을 전부 소문자로 변환한다.
-
[3] 기타 공백 or 숫자 or 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.
list2.remove(s)
: 해당 값이 있으면 제거하고 true을 반환하거나 해당 값이 없으면 false를 반환한다.
-
[4] 공집합일 경우에는
1
로 정의한다. -
[5] 자카드 유사도를 구한다.(소수점이 나오도록 double형으로 변환하여 계산한다)
- 마지막에 정수형으로 return 할 때 int형으로 변환하여 65536을 곱한다.
-
Review
-
2018 KAKAO BLIND RECRUITMENT 1차 5번 문제였다. (난이도 : 중)
-
문제 설명이 길다고 해서 겁먹지 말고, 집중해서 읽으면 쉽게 풀 수 있는 문제였다.
-
조건이 많으면, 풀이 순서를 정리한 뒤에 하나씩 풀어나가는 연습을 꼭 하자.