요르딩딩
프로그래머스 : 뉴스 클러스터링 (레벨2) 본문
728x90
반응형
이번문제는 예외사항을 제외하면 구현하기에는 어렵지않은 문제이다.
여기서 주의해야 할 점에 대해서 알아보자.
1. 영문자만 가능 : 정규식 사용
2. 대소문자 구분 없음 : 모두 대문자로 치환하여 사용
3. 두 집합이 모두 공백일 경우 : 65536 바로 반환
4. list에서 contains() 사용하여 비교가능
5. list 깊은 복사는 .addAll() 사용
6. 교집합 개수 구할때 비교하는 집합에서 제거해가며 카운트해야 올바른 개수를 구할 수 있다.
7. 나누기 소수점 이슈 double사용
8. 소수점 버리기 이슈 int형으로 반환
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
// 집합만들기
for(int i=0; i < str1.length()-1; i++) {
String tmp = str1.substring(i, i+2);
if(tmp.matches("[a-zA-Z]+")) {
list1.add(tmp.toUpperCase());
}
}
for(int i=0; i < str2.length()-1; i++) {
String tmp = str2.substring(i, i+2);
if(tmp.matches("[a-zA-Z]+")) {
list2.add(tmp.toUpperCase());
}
}
if(list1.isEmpty() && list2.isEmpty()) {
return 65536;
}
//작은거 기준으로 비교야한다. 큰거로 할시 중복됨
List<String> minList = new ArrayList<String>();
List<String> maxList = new ArrayList<String>();
if(list1.size() < list2.size()) {
minList.addAll(list1); // 깊은복사
maxList.addAll(list2) ;
}else {
minList.addAll(list2);
maxList.addAll(list1);
}
// 교집합 수 구하기
int nCount =0;
for(String l : minList) {
if(maxList.contains(l)) {
maxList.remove(l);
nCount++;
}
}
int uCount = list1.size() + list2.size() - nCount;
answer = (int) (((double)nCount / (double)uCount) * (double)65536);
return answer;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
// 집합만들기
for(int i=0; i < str1.length()-1; i++) {
String tmp = str1.substring(i, i+2);
if(tmp.matches("[a-zA-Z]+")) {
list1.add(tmp.toUpperCase());
}
}
for(int i=0; i < str2.length()-1; i++) {
String tmp = str2.substring(i, i+2);
if(tmp.matches("[a-zA-Z]+")) {
list2.add(tmp.toUpperCase());
}
}
if(list1.isEmpty() && list2.isEmpty()) {
return 65536;
}
//작은거 기준으로 비교야한다. 큰거로 할시 중복됨
List<String> minList = new ArrayList<String>();
List<String> maxList = new ArrayList<String>();
if(list1.size() < list2.size()) {
minList.addAll(list1); // 깊은복사***
maxList.addAll(list2) ;
}else {
minList.addAll(list2);
maxList.addAll(list1);
}
// 교집합 수 구하기
int nCount =0;
for(String l : minList) {
if(maxList.contains(l)) {
maxList.remove(l); // 교집합 갯수 주의사항***
nCount++;
}
}
int uCount = list1.size() + list2.size() - nCount; //합집합
answer = (int) (((double)nCount / (double)uCount) * (double)65536);
return answer;
}
}
728x90
반응형
'[코딩테스트] > 문제풀이' 카테고리의 다른 글
최고의 집합 (Level 3) (0) | 2022.09.13 |
---|---|
프로그래머스 : k진수에서 소수 개수 구하기 (진수변환, 소수) (0) | 2022.06.16 |
프로그래머스 : 짝지어 제거하기 (stack) (0) | 2022.05.17 |
프로그래머스 : 폰캣몬 (Set) (0) | 2022.05.16 |
프로그래머스 : 괄호변환 (String.CharAt(), 재귀) (0) | 2022.05.13 |
Comments