본문 바로가기
Algorithm/Programmers

[Programmers] 뉴스 클러스터링

by J4J 2021. 4. 12.
300x250
반응형

문제

 

2018 KAKAO BLIND RECRUITMENT > [1차] 뉴스 클러스터링

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

 

 

아이디어

 

이번 문제의 아이디어라고 할만한 것은... 딱히 없는 것 같습니다.

 

굳이 선택하자면... 집합 연산에 대해 아는지 정도라고 생각합니다.

 

해당 문제를 풀기에 앞서 집합연산 수식에 대해 알고 가셔야 될 것이 있습니다.

 

n(A∪B) = n(A) + n(B) - n(A∩B)

=> 집합 A와 집합 B의 합집합 개수 = 집합 A의 개수 + 집합 B의 개수 - 집합 A와 집합 B의 교집합 개수

 

 

아마 고등학교 1학년 수학시간에 배우던 수식일 것입니다.

 

해당 식을 이용하여 문제를 푼다면 다음과 같은 절차로 문제를 풀 수 있습니다.

 

  • str1의 다중집합 구하기
  • str2의 다중집합 구하기
  • str1과 str2의 교집합 구하기

 

 

구현 코드 (Java)

 

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        List<String> str1List = new ArrayList<String>();
        List<String> str2List = new ArrayList<String>();
        
        // 모두 대문자로 치환
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        
        for(int i=0; i<str1.length()-1; i++) { // str1탐색하여 다중집합 저장하기
        	char firstChar = str1.charAt(i);
        	char secondChar = str1.charAt(i+1);
        	
        	if(firstChar >= 'A' && firstChar <= 'Z' && secondChar >= 'A' && secondChar <= 'Z') { // 연속된 두 문자가 모두 영어일 경우
        		String str = firstChar + "" + secondChar;
        		str1List.add(str);
        	}
        }
        
        for(int i=0; i<str2.length()-1; i++) { // str2탐색하여 다중집합 저장하기
        	char firstChar = str2.charAt(i);
        	char secondChar = str2.charAt(i+1);
        	
        	if(firstChar >= 'A' && firstChar <= 'Z' && secondChar >= 'A' && secondChar <= 'Z') { // 연속된 두 문자가 모두 영어일 경우
        		String str = firstChar + "" + secondChar;
        		str2List.add(str);
        	}
        }
        
        // A∩B 개수 구하기
        boolean visited[] = new boolean[str2List.size()]; // str2로 만들어진 다중집합의 원소와 같은것이 있었는지 체크
        int intersection = 0; // 교집합 개수
        for(int i=0; i<str1List.size(); i++) {
        	for(int j=0; j<str2List.size(); j++) {
        		if(!visited[j] && str1List.get(i).equals(str2List.get(j))) { // j번째 원소를 사용한 적이 없고 str1의 다중집합과 원소가 같을 경우
        			visited[j] = true;
        			intersection++;
        			break;
        		}
        	}
        }
        
        int union = str1List.size() + str2List.size() - intersection; // n(A∪B) = n(A) + n(B) - n(A∩B)
        
        if(str1List.size() == 0 && str2List.size() == 0) { // 모두 공집합일 경우
        	return 65536*1;
        } else {
        	return 65536*intersection/union;
        }
    }
}

 

 

읽어주셔서 감사합니다.

728x90
반응형

'Algorithm > Programmers' 카테고리의 다른 글

[Programmers] 풍선 터트리기  (0) 2021.04.14
[Programmers] 삼각 달팽이  (0) 2021.04.13
[Programmers] 추석 트래픽  (0) 2021.04.11
[Programmers] 길 찾기 게임  (0) 2021.04.02
[Programmers] 후보키  (0) 2021.03.27

댓글