본문 바로가기

Algorithm/카카오

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

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

 

프로그래머스

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

programmers.co.kr

 

 

1. 해결 방법

꽤 헤맸지만 그렇게 어렵다고 느낄만한 문제는 아니었다.
확실히 알고리즘 한달차였을 땐 레벨 2라도 카카오 문제에서 엄청 막히고 답이 안보였는데, 두달 가까이 꾸준하게 하다보니 두렵지 않고 좋은 문제네 라는 느낌이 는다.

디버깅 포함 1시간 10분 정도 걸렸다.


1. 주어진 문자열을 for문 돌린다.
2. for문을 돌면서 알파벳 문자열을 제외한 두 쌍을 새로운 배열로 만든다. 해당 알파벳은 대소문자 구분이 없어야 하므로 전부 대문자로 바꾸었다.
3. set을 이용해서 합집합, 교집합을 구하고 새로운 배열에 넣는다. -> 새로운 배열을 굳이 더 생성하는 이유는 set을 이용하면 중복이 없어지기에 앞서 대문자로 바꿔놓은 문자열을 기준으로 count 카운팅 하기 위함.
4. 카운팅하고 교집합, 합집합의 크기를 구한 다음, 주어진 계산을 한다.

 

 

2. 정답코드

def solution(str1, str2):
    answer = 0
    
    new_arr1, new_arr2 = [], []
    for i in range(len(str1) - 1):
        if str1[i].isalpha() and str1[i + 1].isalpha():
            new_arr1.append(str(str1[i].upper()) + str(str1[i + 1].upper()))
            
    for i in range(len(str2) - 1):
        if str2[i].isalpha() and str2[i + 1].isalpha():
            new_arr2.append(str(str2[i].upper()) + str(str2[i + 1].upper()))
    
    inter_list = (set(new_arr1) & set(new_arr2))
    union_list = (set(new_arr1) | set(new_arr2))
    
    inter_len = 0
    for inter in inter_list:
        inter_len += min(new_arr1.count(inter), new_arr2.count(inter))
    
    union_len = 0
    for union in union_list:
        union_len += max(new_arr1.count(union), new_arr2.count(union))

    if inter_len == 0 and union_len == 0:
        answer = 65536
    else:
        answer = int((inter_len / union_len) * 65536)
    
    return answer