코드를 느껴바라

Lv.2 뉴스 클러스터링 [JAVA] 본문

PS/프로그래머스(Programmers)

Lv.2 뉴스 클러스터링 [JAVA]

feelTheCode 2025. 3. 10. 11:47
반응형

문제 링크

성공 여부(걸린 시간): 성공 (45분)

아이디어

처음에 문제를 제대로 읽지 않고 풀다가 놓친점들을 좀 강조해서 설명을 해보자면

문제의 조건

  1. 대소문자 달라도 같은 알파벳이라면 같은 것으로 취급
  2. 다중집합도 가능해야함
  3. 집합 둘 다 공집합이라면 유사도는 1이다.

사실 이 두개를 염두하지 않고 코드를 짠 것이 20분을 잡아먹었다.

크게 로직은 이러하다.

ArrayList은 총 3개로 이루어진다.
str1의 2개씩 잘린 알파벳만을 포함하는 문자열의 집합
str2의 2개씩 잘린 알파벳만을 포함하는 문자열의 집합
그 둘을 모두 가지는 합집합

그런다음 A나 B를 기준으로 순회하며 다른 집합에 존재하는 교집합을 세어주고 상대 집합에서 해당 원소를 빼준다.
나는 A를 기준으로 했음

그렇게 교집합의 수를 구했다면
자카드 유사도를 구해주면 되는데 여기서 합집합의 개수는 sum의 사이즈에서 교집합의 수를 빼주면 된다.
그리고 교집합은 아까 구한값으로 넣고 return해주면 되는데
문제에서 둘다 공집합이라면 자카드 유사도가 1이니 65536로 리턴해주는 그 예외만 처리해주면 된다.

정답 코드

import java.util.*;
class Solution {
    public int solution(String str1, String str2) {
        ArrayList<String> A= new ArrayList<>();
        ArrayList<String> B= new ArrayList<>();
        ArrayList<String> sum= new ArrayList<>();
        for(int i=0; i<str1.length()-1; i++){
            String temp = str1.substring(i, i+2);

            if(isAlpha(temp.charAt(0))&&isAlpha(temp.charAt(1))){
                temp = temp.toUpperCase();
                A.add(temp);
                sum.add(temp);
                System.out.println("A: "+temp);
            }
        }
        for(int i=0; i<str2.length()-1; i++){
            String temp = str2.substring(i, i+2);
            if(isAlpha(temp.charAt(0))&&isAlpha(temp.charAt(1))){
                temp = temp.toUpperCase();
                B.add(temp);
                sum.add(temp);
                System.out.println("B: "+temp);
            }
        }
        int same = 0;
        for(String x: A){
            if(B.contains(x)){
                B.remove(x);
                same++;
            }
        }
        System.out.println(same+", "+sum);
        float answer = (float)same/(float)(sum.size()-same)*(float)65536;
        return A.size()+B.size() ==0? 65536: (int)answer;
    }
    static boolean isAlpha(char x){
        return (x>='A'&&x<='Z')||(x>='a'&&x<='z');
    }
}

 

반응형

'PS > 프로그래머스(Programmers)' 카테고리의 다른 글

Lv.2 캐시 [JAVA]  (0) 2025.03.12
Lv.2 프렌즈4블록 [JAVA]  (3) 2025.03.11
Lv.3 표 병합 [JAVA]  (0) 2025.03.08
Lv.3 보행자 천국 [JAVA]  (3) 2025.03.03
Lv.3 GPS [JAVA] - (2017 카카오코드페스티벌 본선)  (0) 2025.03.01