코딩테스트 - 프로그래머스/JAVA

[프로그래머스 / 2018 KAKAO BLIND RECRUITMENT / 자바(JAVA)] [1차] 뉴스 클러스터링

읁; 2024. 5. 6. 13:23

 

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

 

프로그래머스

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

programmers.co.kr

[ 요약 ]

더보기

시작 시간 : 11:39

종료 시간 : 13:02

소요 시간(분) : 82분

 

도전 횟수 (제출 횟수) : 1

로직 및 풀이 참고 여부 : O

 

[ 풀어보기 ]

 

 

풀이

📌 로직

  1. 다중집합을 만드는 메소드 makeMultiSet
    • "다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. "AB"와 "Ab", "ab"는 같은 원소로 취급한다." 라는 입력 형식에 따라, str을 전부 소문자로 만들기.
    • 이를 char Array로 만든다.
    • char Array의 길이만큼 i가 증가하는 for문을 생성
    • 만약 charArray[i] 가 a ~ z에 속하면, String Builder에 append 한다.
    • 만약 charArray[i+1]이 a ~ z에 속하면, String Builder 에 append 한다.
    • 위 둘을 거치고 난 후 StringBuilder의 길이가 2가 되었다면,
      ( = 즉, charArray[i] 와 charArray[i+1] 둘 다 a~z에 속한다면) ArrayList에 추가한다.
    • StringBuilder를 비워준다.
    • 과정을 다 거치고 난 후, ArrayList를 return 한다.
  2. str1 과 str2를 각각 makeMultiSet의 매개변수로 넘겨, 그들의 다중집합을 만든다.
    • (각각 strArr1, strArr2 로 칭함)
  3. 교집합을 구한다.
    • strArr1 을 순회하는 확장 for문을 생성, 그의 원소를 String a라고 지정한다.
    • union 에 a를 add하고, 만약 a가 strArr2에도 있다면 intersaction 에도 add한다. 
  4. 합집합을 구한다.
    • intersaction에 add 되지 않은 strArr2의 원소들을 union에 add한다.
    • 이를 위해, 교집합을 구하는 과정에서
      '만약 a가 strArr2에도 있다면' strArr2 에서 a를 지우고 intersaction에 add하고,
    • 지워진 원소들을 제외한 strArr2의 나머지 원소들을 union에 add하면 된다.

 

📌 코드

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {

        List<String> strArr1 = makeMultiSet(str1);
        List<String> strArr2 = makeMultiSet(str2);
        
        List<String> intersaction = new ArrayList<>();
        List<String> union = new ArrayList<>();
        
        
        // 교집합 구하기
        for(String a : strArr1) {
            if(strArr2.remove(a)) { // 지워지면 true를 반환 = 교집합에 속함
                intersaction.add(a);
            }
            
            union.add(a);
        }
        
        // 합집합 구하기
        for(String a : strArr2) {
            union.add(a); // 교집합에 속하지 않은 나머지 원소들 추가
        }
        
        // 자카드
        double a = intersaction.size();
        double b = union.size();
        double jaccard = (b==0)?65536:a/b*65536;
        
        return (int)jaccard;
    }
    
    private List<String> makeMultiSet (String str) {
        List<String> strArrList = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        str = str.toLowerCase();
        
        char[] charArr = str.toCharArray();
        
        for(int i=0; i<charArr.length-1; i++) {
            
            if(charArr[i]>='a' && charArr[i]<='z')
                sb.append(charArr[i]);
            
            if(charArr[i+1]>='a' && charArr[i+1]<='z')
                sb.append(charArr[i+1]);
            
            if(sb.length()==2)
                strArrList.add(sb.toString());
            
            sb.setLength(0);
        }

        return strArrList;
    }
    
}

 

📌 채점 결과

정확성  테스트
테스트 1 〉	통과 (0.11ms, 75.1MB)
테스트 2 〉	통과 (0.09ms, 78.1MB)
테스트 3 〉	통과 (0.07ms, 76.1MB)
테스트 4 〉	통과 (1.63ms, 66.8MB)
테스트 5 〉	통과 (0.08ms, 71.3MB)
테스트 6 〉	통과 (0.08ms, 76.3MB)
테스트 7 〉	통과 (0.37ms, 75.6MB)
테스트 8 〉	통과 (0.07ms, 78.7MB)
테스트 9 〉	통과 (0.30ms, 84.5MB)
테스트 10 〉	통과 (0.49ms, 74.8MB)
테스트 11 〉	통과 (0.74ms, 82.9MB)
테스트 12 〉	통과 (0.06ms, 73.8MB)
테스트 13 〉	통과 (0.16ms, 83.5MB)

채점 결과
정확성: 100.0
합계: 100.0 / 100.0