컴퓨터/프로그래머스
프로그래머스 - 17677번: [1차] 뉴스 클러스터링 [Java]
이상한 나그네
2023. 10. 15. 00:21
문제: https://school.programmers.co.kr/learn/courses/30/lessons/17677
1. 코드
import java.util.*;
class Solution {
public List<String> stringSplit(String str) {
List<String> list = new ArrayList<>();
for(int i = 0; i + 2 <= str.length(); i++) {
String s = str.substring(i, i + 2).toUpperCase();
if(s.matches("[A-Z]+"))
list.add(s);
}
return list;
}
public int solution(String str1, String str2) {
int answer = 65536;
List <String> s1 = stringSplit(str1);
List <String> s2 = stringSplit(str2);
int sum = s1.size() + s2.size();
int same = 0;
while(!s1.isEmpty() && !s2.isEmpty()) {
int index = s2.indexOf(s1.get(0));
if(index != -1) {
same++;
s2.remove(index);
}
s1.remove(0);
}
if(sum != 0)
answer *= (double)same / (sum - same);
return answer;
}
}
2. 설명
public List<String> stringSplit(String str) {
List<String> list = new ArrayList<>();
for(int i = 0; i + 2 <= str.length(); i++) {
String s = str.substring(i, i + 2).toUpperCase();
if(s.matches("[A-Z]+"))
list.add(s);
}
return list;
}
stringSplit 함수는 str1과 str2에서 대문자를 기준으로 2글자씩 분리하며 영단어 이루어진 것만 List에 추가하여 List를 반환해줍니다.
int answer = 65536;
List <String> s1 = stringSplit(str1);
List <String> s2 = stringSplit(str2);
int sum = s1.size() + s2.size();
str1의 분리된 List는 s1에 str2는 s2에 저장한 뒤 두 개의 원소 갯수 합을 sum 변수에 저장합니다.
int same = 0;
while(!s1.isEmpty() && !s2.isEmpty()) {
int index = s2.indexOf(s1.get(0));
if(index != -1) {
same++;
s2.remove(index);
}
s1.remove(0);
}
same은 분리된 원소들 중 동일한 수를 나타냅니다. s1 또는 s2가 비어질 때까지 반복해주는데 s2에서 s1의 첫번째 요소가 있는지 검사 후 있다면 same을 1증가시키고 s2에서 해당 원소를 제거합니다. s1에서 첫번째 요소는 무조건 제거합니다.
if(sum != 0)
answer *= (double)same / (sum - same);
sum의 값이 0이 아니라면 나눌 수 있기에 나눈 값을 곱해줍니다. 그리고 answer를 반환하면 문제는 해결됩니다.
3. 정리
- 리스트와 정규식으로 쉽게 해결된다.
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/challenges