[문제 설명]
programmers.co.kr/learn/courses/30/lessons/17677
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
[풀이 과정]
1. 매개변수로 주어진 2개의 문자열을 각각 list로 만든다. (메서드를 생성)
1-1) 문자열을 매개변수로 가지고 String 리스트를 반환하는 메서드 생성 (List<String> getStrArray(String str))
1-2) 문자열 길이 처음 ~ 마지막-1 까지 for문을 돌면서 해당 문자가 영어인지 확인(아스키 코드 이용)
1-2-1) 문자열을 담을 String 변수 선언 (s)
1-2-2) 첫번째 문자가 영어이면 s에 연결, 영어가 아니면 continue;
1-2-3) 두번째 문자가 영어이면 s에 연결, 영어가 아니면 continue;
1-2-4) 첫번째, 두번째 문자가 모두 s에 연결되면 리스트에 s를 삽입
1-2-5) 이와 같은 로직을 for문을 돌며 반복 ..
2. HashMap 2개, Set 1개 생성
3. map1에 첫번째 문자열 리스트에서 문자열 하나씩을 꺼내 key로, 개수를 value로 put.
set에는 문자열만 put (중복되는 문자열을 자동으로 제거)
두번째 문자열도 마찬가지로 map2, set에 담음.
4. 만약 map1, map2가 둘다 비어있다면, 65536 을 반환
5. 교집합 크기를 담을 변수 interIndex = 0, 합집합 크기를 담을 변수 unionIndex = 0 를 선언
6. set에서 문자열 하나씩 꺼내면 for loop
6-1) map1, map2에서 set에서 꺼내는 문자열을 key로 갖는 value를 담는 int 변수 num1, num2 선언.
만약 map에 해당 문자열을 key로 갖는 value가 없다면 0 반환.
6-2) num1, num2 가 모두 0이 아니라면 교집합이므로 interIndex에 num1과 num2중 작은 숫자를 더함.
그리고 unioinIndex에는 num1과 num2 중 큰수에서 작은수를 뺀 값을 더함.
6-3) num1, num2중 둘중 하나의 수가 0이라면 교집합이 아니므로 합집합에 사용됨.
unionIndex 에 num1과 num2를 더함 (어차피 하나는 0이므로 둘다 더함)
7. 교집합 / 합집합 + 교집합 을 함. 소숫점까지 실수를 구하려면 분모를 double 형으로 형변환을 해줌.
8. 7에서 구한 수에 65536을 곱하면 답
[JAVA code]
package com.algorithm.level2;
import java.util.*;
import java.util.regex.Pattern;
public class Test32 {
public static void main(String[] args) {
String str1 = "handshake";
String str2 = "shake hands";
System.out.println("answer : " + solution(str1, str2));
}
public static int solution(String str1, String str2) {
final int DEFAULT_NUM = 65536;
List<String> list1 = getStrArray(str1);
List<String> list2 = getStrArray(str2);
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
Set<String> set = new HashSet<>();
for (String s1 : list1) {
map1.put(s1, map1.getOrDefault(s1, 0) + 1);
set.add(s1);
}
for (String s2 : list2) {
map2.put(s2, map2.getOrDefault(s2, 0) + 1);
set.add(s2);
}
if (map1.isEmpty() && map2.isEmpty()) {
return DEFAULT_NUM;
}
int interIndex = 0;
int unionIndex = 0;
for (String s : set) {
int num1 = map1.getOrDefault(s, 0);
int num2 = map2.getOrDefault(s, 0);
if (num1 != 0 && num2 != 0) {
interIndex += Math.min(num1, num2);
unionIndex += (Math.max(num1, num2) - Math.min(num1, num2));
} else {
unionIndex += num1 + num2;
}
}
double answer = interIndex / (double) (unionIndex + interIndex);
answer = answer * DEFAULT_NUM;
return (int) answer;
}
public static List<String> getStrArray(String str) {
List<String> stringList = new ArrayList<>();
for (int i = 0; i < str.length() - 1; i++) {
int ascii = str.charAt(i);
String s = "";
if ((65 <= ascii && ascii <= 90) || (ascii >= 97 && ascii <= 122)) {
s += str.charAt(i) + "";
} else {
continue;
}
ascii = str.charAt(i + 1);
if ((65 <= ascii && ascii <= 90) || (ascii >= 97 && ascii <= 122)) {
s += str.charAt(i + 1) + "";
} else {
continue;
}
stringList.add(s.toLowerCase());
}
return stringList;
}
/*public static List<String> getStrArray(String str) {
List<String> stringList = new ArrayList<>();
for (int i = 0; i < str.length() - 1; i++) {
String s = "";
String c = str.charAt(i)+"";
if (Pattern.matches("^[a-zA-Z]*$", c)) {
s+=c;
}else {
continue;
}
c = str.charAt(i+1)+"";
if (Pattern.matches("^[a-zA-Z]*$", c)) {
s+=c;
}else {
continue;
}
stringList.add(s.toLowerCase());
}
return stringList;
}*/
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 합승 택시 요금 - JAVA (0) | 2021.08.25 |
---|---|
[프로그래머스] 무지의 먹방 라이브 - JAVA (0) | 2021.08.02 |
[프로그래머스][Level4] 자동완성 - JAVA (0) | 2021.07.24 |
[프로그래머스][LEVEL2] 캐시 - JAVA (0) | 2021.07.22 |
[프로그래머스] [Level2] 프렌즈4블록 - JAVA (0) | 2021.07.14 |