str1.charAt(i)>=65 && str1.charAt(i)<=90) || (str1.charAt(i)>=97 && str1.charAt(i)<=122
해당 조건을 통해서 영어 소문자, 대문자인 경우에만
임시 문자열인 temp에 담아 줄수 있도록 했고 그 외에 경우에는 문자열에 포함되면 안되므로
temp를 초기화해주었다.
2단어씩 끊어서 단어를 만들어야하므로 temp의 길이가 2가 된경우에는 list에 넣어주고 substring을 이용해서 맨 앞글자를 잘랐다.
int gyo = 0;
for(int i=0; i<alist.size(); i++){
for(int j=0; j<blist.size(); j++){
if(blist.get(j).equalsIgnoreCase(alist.get(i))){
gyo++;
blist.remove(j);
break;
}
}
}
int hap = alist.size()+blist.size();
alist와 blist를 비교해서 대소문자를 무시한 비교(equalsIgnoreCase)를 한뒤에 같은 단어가 있을경우 둘의 공통부분인 것의 개수인(교집합) gyo에 +1을해주고, blist에서 해당 값을 제거했다.
그렇게 되면 둘의 합집합은 alist+blist를 해주게 되면 둘의 공통부분은 없기 때문에 둘의 합으로 구할 수 있게 된다.
두개가 공집합인 경우에는 65536을 그대로 return 하고 아닌 경우에는
double score = (double)(gyo)/(double)(hap) * 65536;
answer = (int)Math.floor(score);
를 사용해서 구하였다.
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
List<String>alist = new ArrayList<>();
List<String>blist = new ArrayList<>();
String temp = "";
for(int i=0; i<str1.length(); i++){
if( (str1.charAt(i)>=65 && str1.charAt(i)<=90) || (str1.charAt(i)>=97 && str1.charAt(i)<=122)){
temp+=str1.substring(i,i+1);
}else{
temp = "";
}
if(temp.length()==2){
alist.add(temp);
temp=temp.substring(1,2);
}
}
temp="";
for(int i=0; i<str2.length(); i++){
if( (str2.charAt(i)>=65 && str2.charAt(i)<=90) || (str2.charAt(i)>=97 && str2.charAt(i)<=122)){
temp+=str2.substring(i,i+1);
}else{
temp = "";
}
if(temp.length()==2){
blist.add(temp);
temp=temp.substring(1,2);
}
}
int gyo = 0;
for(int i=0; i<alist.size(); i++){
for(int j=0; j<blist.size(); j++){
if(blist.get(j).equalsIgnoreCase(alist.get(i))){
gyo++;
blist.remove(j);
break;
}
}
}
int hap = alist.size()+blist.size();
if(alist.size()==0 && blist.size()==0){
return 65536;
}
double score = (double)(gyo)/(double)(hap) * 65536;
answer = (int)Math.floor(score);
return answer;
}
}