문제
https://school.programmers.co.kr/learn/courses/30/lessons/17677
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
1. 대문자와 소문자의 차이는 무시한다. 따라서 toUpperCase()를 이용하여 영문자들은 대문자로 바꿔준다.
2. 입력으로 들어온 문자열은 두 글자씩 원소로 만든다. 이는 substring 함수를 이용하여 문자열을 2글자씩 추출한다.
3. 영문자로만 된 글자쌍만 유효하므로 matches함수를 이용하여 영문자로만 된 글자쌍이면 list에 넣는다.
매개변수로 들어오는 str1과 str2에 대해 위 과정을 반복한다.
4. 두 배열이 모두 공집합이면 = list가 비어있으면 유사도가 1이므로 65336을 리턴하면 된다.
5. list1의 원소가 list2에 있으면 intersect 리스트에 push한다. 그리고 list2에서 그 원소들을 지워준다. list1의 원소들은 모두 union 리스트에 넣는다.
6. list2의 원소들을 모두 union에 넣는다. 교집합들은 list2에서 지워져서 모두 union에 넣어도 상관없다
HashSet은 원소들이 중복되지 않도록 한다.
하지만, 이 문제는 다중집합을 만드는 문제다.
즉, 중복되는 원소가 있을 수 있다는 뜻이다. 따라서, 직접 union과 intersect를 구해줘야 한다.
코드
import java.util.*;
class Solution {
public double solution(String str1, String str2) {
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
for(int i=0;i<str1.length()-1;i++){
String str = str1.substring(i,i+2);
if(str.matches("^[A-Z]*$")){
list1.add(str);
}
}
for(int i=0;i<str2.length()-1;i++){
String str = str2.substring(i,i+2);
if(str.matches("^[A-Z]*$")){
list2.add(str);
}
}
if(list1.size() == 0 && list2.size() == 0){
return 65536;
}
List<String> intersect = new ArrayList<>();
List<String> union = new ArrayList<>();
for(String i : list1){
if(list2.contains(i)){
intersect.add(i);
list2.remove(list2.indexOf(i));
}
union.add(i);
}
for(String i : list2) {
union.add(i);
}
double answer = Math.floor(intersect.size() * 65536 / union.size());
return answer;
}
}