[문제]
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[내 풀이]
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
Map<String,Integer> arr1 =new HashMap<>(), arr2 = new HashMap<>();
HashSet<String> set = new HashSet<>(); //합집합용
for(int i=0; i<str1.length()-1; i++){
String temp = str1.substring(i, i+2);
if(Character.isAlphabetic(temp.charAt(0)) &&
Character.isAlphabetic(temp.charAt(1))){
arr1.put(temp,arr1.getOrDefault(temp,0)+1);
set.add(temp);
}
}
for(int i=0; i<str2.length()-1; i++){
String temp = str2.substring(i, i+2);
if(Character.isAlphabetic(temp.charAt(0)) &&
Character.isAlphabetic(temp.charAt(1))){
arr2.put(temp,arr2.getOrDefault(temp,0)+1);
set.add(temp);
}
}
int interSize = 0;
for(String s : set){ //합집합 크기
interSize +=Math.max(arr1.getOrDefault(s,0),arr2.getOrDefault(s,0));
}
//공집합 및 다중집합 크기
for(String s : arr2.keySet()){
if(arr1.containsKey(s)){
answer += Math.min(arr1.get(s),arr2.get(s));
}
}
if(interSize == 0) return 65536;
answer = answer*65536/interSize;
return answer;
}
}
[풀이]
교집합 , 합집합 , 둘다 공집합인 경우 , 다중집합을 구해야한다.
우선 substring()을 사용해서 두글자씩 끊어준 뒤 isAlphabetic()을 이용하여 알파벳이 아닌경우 제외하도록 하였다.
1. 교집합 : HashMap<>을 2개 선언하여 구하였다. Key를 substring으로 분리된 2글자 , value를 갯수로 정하였다.
2. 합집합 : 중복이 허용되지않는 HashSet에 2개 집합의 요소를 모두 넣어준다.
3. 공집합 : HashMap에 아무 값도 들어있지 않다면 interSize가 0이 되므로 공집합 즉 1 * 65536을 리턴한다
4. 다중집합 : 예시3번같은 경우를 말한다. 이 경우도 결국은 HashMap에 key의 수가 1개일 뿐 value가 1이상이기 때문에 Math.min()을 사용하면 문제없이 넘어갈 수 있다.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[JAVA] 둘만의 암호 (1) | 2023.02.21 |
---|---|
[JAVA] 개인정보 수집 유효기간 (0) | 2023.02.21 |
[JAVA] 프린터 (0) | 2023.02.21 |
[JAVA] 카드 뭉치 (0) | 2023.02.20 |
[JAVA , Lv2] 기능개발 (0) | 2023.02.16 |