본문 바로가기
공부-코딩테스트/코테풀이 - 자바, 파이썬

뉴스 클러스터링 (코딩테스트, 프로그래머스, 파이썬)

by 령과 2022. 2. 26.

문제

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

 

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

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

programmers.co.kr

나의 코드

def solution(str1, str2):
    str1_dict={}
    str2_dict={}
    str1 = str1.upper()
    str2 = str2.upper()
    
    for i in range(len(str1)-1):
        target = str1[i:i+2]
        if target != ''.join(char for char in target if char.isalpha()):
            continue
        if target in str1_dict.keys():
            str1_dict[target][0]+=1
        else:
            str1_dict[target]=[1]
            
    print(str1_dict)
    
    for i in range(len(str2)-1):
        target = str2[i:i+2]
        if target != ''.join(char for char in target if char.isalpha()):
            continue
        if target in str2_dict.keys():
            str2_dict[target]+=1
        else:
            str2_dict[target]=1

    for key in str2_dict.keys():
        if key in str1_dict.keys():
            str1_dict[key].append(str2_dict[key])
        else:
            str1_dict[key]=[str2_dict[key]]
            
    num_1 = 0
    num_2 = 0
    
    for key in str1_dict.keys():
        if len(str1_dict[key]) == 1:
            num_2 += str1_dict[key][0]
        else:
            num_1 += min(str1_dict[key])
            num_2 += max(str1_dict[key])
    
    print(str2_dict)
    
    print(str1_dict)
    
    if(num_2==0):
        return 1*65536
    
    else:
        return int((num_1/num_2)*65536)

해당 문제의 핵심은 문자열에서 조건에 맞게 나눠서 새로운 요소들을 만들고 각 요소 수를 count한 다음

두개의 string의 교집합, 합집합의 수를 판단하는 문제였다.

1번째 출력은 str1의 요소들에 대한 딕셔너리, 2번째 출력은 str2의 요소들에 대한 딕셔너리이다.

3번째 출력은 str1 딕셔너리에 str2요소들을 추가하는 경우다.

교집합은 num_1으로 표현했는데 딕셔너리 요소들에서 리스트 길이가 2이면 가작 작은 값을 누적해서 합하고,

합집합은 num_2으로 표현했는데 딕셔너리 요소들에서 리스트 길이가 1이면 누적 합, 2라면 둘 중 큰 값을 누적시킨다.

 

새로 알게된 점

1. string.isalpha() : string에 영어, 한글로만 이루어져 있다면 true, 아니면 false

 

2. string.isalnum() : string에 영어, 한글, 숫자로만 이루어져 있다면 true, 아니면 false

 

3. set들 끼리 & | 를 사용하는 방법

의 결과는 

list는 사용할 수 없는 방법이다.

 

댓글