본문 바로가기

알고리즘 풀이/프로그래머스

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

🔗 문제 링크

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

 

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

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

programmers.co.kr

 

📝 풀이 과정

집합을 만들어 교집합과 합집합을 조사해야 하는데, 같은 원소가 여러번 등장할 수 있고 자주 찾아 반환해주어야 하기 때문에 HashMap 자료구조를 사용하기로 했다.

 

집합에 대소문자 구분은 없으므로 String.toLowerCase()를 사용해 모든 문자열을 소문자로 변경해주었다. 첫번째 문자열을 모두 끊어 Map에 넣어준뒤 두번째 문자열 반복을 돌며 해당 문자열이 존재하면 교집합 개수를 증가시켜주는 방식을 사용해 교집합과 합집합의 수를 세어주었다.

 

 

if (!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1))) {
  continue;
}

String key = str1.substring(i, i + 2);
map.put(key, map.getOrDefault(key, 0) + 1);

첫번째 문자열에서 문자를 모두 2개씩 끊어 map에 <원소, 원소가 등장한 횟수>로 저장하기로 했다. 만약 하나라도 알파벳이 아니라면 continue를 통해 건너 뛰어주었고, 아니라면 map에 추가했다.

 

 

if (map.containsKey(key)) {
  if (map.put(key, map.get(key) - 1) == 1) {
    map.remove(key);
    interCnt++;
  }
  unionCnt++;
}

다시 비슷한 방식으로 두 번째 문자열을 끊어주었는데, 만약 key가 Map에 포함되어있다면 첫번째 문자열에도 존재했던 key이므로 interCnt를 증가시켜주었고, 아니라면 unionCnt만 증가시켜주었다.

 

 

최종적으로 map에 남은 숫자를 unionCnt에 더해주고, unionCnt가 0이라면 65536를 반환하고 아니라면 계산값을 반환해주면 된다.

 

 

💻 코드

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static int MULTI = 65536;

    public int solution(String str1, String str2) {
        Map<String, Integer> map = new HashMap<>();

        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        for (int i = 0; i < str1.length() - 1; i++) {
            if (!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1)))
                continue;

            String key = str1.substring(i, i + 2);
            map.put(key, map.getOrDefault(key, 0) + 1);
        }

        int interCnt = 0, unionCnt = 0;
        for (int i = 0; i < str2.length() - 1; i++) {
            if (!Character.isAlphabetic(str2.charAt(i)) || !Character.isAlphabetic(str2.charAt(i + 1)))
                continue;

            String key = str2.substring(i, i + 2);
            if (map.containsKey(key)) {
                if (map.put(key, map.get(key) - 1) == 1)
                    map.remove(key);
                interCnt++;
            }
            unionCnt++;

        }

        for (String key : map.keySet())
            unionCnt += map.get(key);

        return unionCnt == 0 ? MULTI : (int) (((double) interCnt / unionCnt) * MULTI);
    }

}