관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[알고리즘] 프로그래머스 뉴스 클러스터링 - 2018 KAKAO BLIND RECRUITMENT 본문

알고리즘/일반(단순구현)

[알고리즘] 프로그래머스 뉴스 클러스터링 - 2018 KAKAO BLIND RECRUITMENT

막무가내막내 2020. 3. 27. 18:13
728x90

 

 

 

https://programmers.co.kr/learn/courses/30/lessons/17677#

 

프로그래머스

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

programmers.co.kr

 

 

 

카카오 코딩테스트 중급 문제를 풀어 봤습니다. 이 문제도 이전문제처럼 지인이 추천한 문제입니다. ㅎㅎ
자카드 유사도 라는 알고리즘을 구현하는 문제라고 보면 될 것 같습니다

문제를 보자마자 HashMap의 getOrDefault() 를 사용하여 풀어야겠다고 생각이 들어 그대로 풀어버렸습니다.

예전에도 이 함수로 풀었던 문제가 기억나네요.

https://youngest-programming.tistory.com/170

 

[알고리즘] 프로그래머스 완주하지 못한 선수 -hash-

https://programmers.co.kr/learn/courses/30/lessons/42576 코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가..

youngest-programming.tistory.com

 

해결 후 다른 사람들 풀이도 봤는데 HashMap 사용하는 사람은 저밖에 안보이고 다들 리스트나 배열로 그냥 풀더라고요.. 

참고하면 좋을 것 같습니다. 

 

영문 정규식, 맵 EntrySet로 갖고오는거는 꼭 머릿속에 기억하도록 해야겠습니다. !! (군대에서 2년동안 이클립스도 모르고 자바의 정석 책만 봤어서 Map의 EntrySet 차례대로 갖고오는 거는 안까먹을 것 같습니다. ㅎㅎ TMI ) 

 

 

 

코드는 다음과 같습니다. 주석으로 설명 적어놨습니다. !

교집합 개수 , 합집합 개수 는 마지막에 계산을 위해서만 사용하기 때문에 nList , uList ArrayList 말고 그냥 int로 개수 증가시키는 걸로 해도 되는데 전 List 빠이기 때문에 허허허

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;

class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.solution("handshakee", "shake hands");
    }

    public int solution(String str11, String str22) {
        String str1 = str11.toLowerCase();
        String str2 = str22.toLowerCase();
        int answer = 0;
        HashMap<String, Integer> map1 = new HashMap();
        HashMap<String, Integer> map2 = new HashMap();
        ArrayList<String> nList = new ArrayList<>(); //교집합
        ArrayList<String> uList = new ArrayList<>(); //합집합
        String mapKey1;
        String mapKey2;
        int i = 0;
        //str1 초기화
        while (i != str1.length() - 1) {
            mapKey1 = str1.substring(i, i + 2);
            if (isEng(mapKey1)) {
                map1.put(mapKey1, map1.getOrDefault(mapKey1, 0) + 1);
            }
            i++;
        }
        //str2 초기화
        i = 0;
        while (i != str2.length() - 1) {
            mapKey2 = str2.substring(i, i + 2);
            if (isEng(mapKey2)) {
                map2.put(mapKey2, map2.getOrDefault(mapKey2, 0) + 1);
            }
            i++;
        }
        Iterator<Map.Entry<String, Integer>> entries1 = map1.entrySet().iterator();
        while (entries1.hasNext()) {
            Map.Entry<String, Integer> entry = entries1.next();

            // str1 만 값 갖고있거나 더 많이 혹은 똑같이 갖고 있는 경우
            if (entry.getValue() >= map2.getOrDefault(entry.getKey(), 0)) {
                // 합집합 처리(더많은기준으로)
                for (i = 0; i < entry.getValue(); i++) {
                    uList.add(entry.getKey());
                }
                // 교집합 처리(더적은거 기준으로, 겹치는거없으면 0)
                for (i = 0; i < map2.getOrDefault(entry.getKey(), 0); i++) {
                    nList.add(entry.getKey());
                }
                if (map2.getOrDefault(entry.getKey(), 0) != 0) {
                    map2.remove(entry.getKey());
                }
            } else { // str2 가 str1 보다 해당 값 더 많이 갖고 있는 경우
                // 합집합 처리
                for (i = 0; i < map2.get(entry.getKey()); i++) {
                    uList.add(entry.getKey());
                }
                // 교집합 처리
                for (i = 0; i < entry.getValue(); i++) {
                    nList.add(entry.getKey());
                }
                if (map2.getOrDefault(entry.getKey(), 0) != 0) {
                    map2.remove(entry.getKey());
                }
            }
        }
        //남은 map2 꺼 합집합에 추가(str2만 갖고있는 값)
        Iterator<Map.Entry<String, Integer>> entries2 = map2.entrySet().iterator();
        while (entries2.hasNext()) {
            Map.Entry<String, Integer> entry = entries2.next();
            for(i=0; i<entry.getValue(); i++){
                uList.add(entry.getKey());
            }
        }
        //자카드 유사도
        if (uList.size() == 0) {
            return 65536;
        } else {
            answer = (int) ((double) nList.size() / uList.size()*65536);;
            return answer;
        }

    }

    private static boolean isEng(String str) {
        boolean flag = Pattern.matches("^[a-zA-Z]*$", str);
        return flag;
    }
}
728x90
Comments