컴퓨터/프로그래머스

프로그래머스 - 17677번: [1차] 뉴스 클러스터링 [Java]

이상한 나그네 2023. 10. 15. 00:21

문제: https://school.programmers.co.kr/learn/courses/30/lessons/17677

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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. 정리

  1. 리스트와 정규식으로 쉽게 해결된다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges