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

[Level 2] 뉴스 클러스터링

mhko411 2021. 8. 29. 14:38
728x90

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

 

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

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

programmers.co.kr


접근

다중 교집합과 합집합을 어떻게 구현할지를 결정하면 다른 조건은 쉽게 처리할 수 있었다. 먼저 나의 풀이에서는 문자열을 두 글자씩 끊어서 새로운 리스트를 생성한 후에 리스트 A에 있는 문자가 B에 있으면 교집합 리스트에 넣고 해당 문자를 B에서 삭제한다.. 이 과정에서 해당 문자가 알파벳이라면 합집합 리스트에 넣는다. 

위의 과정을 거친 후에 B에는 A에 없는 문자만 남게되고 알파벳으로만 구성되어있는 문자를 합집합 리스트에 다시 추가한다.

 

이제 교집합과 합집합의 크기를 통해 유사도를 계산한다.

 

구현

- 전달받은 두 개의 문자열을 대문자로 변환하고 

- A와 B에 리스트로 변환하여 저장한다.

str1 = str1.upper()
str2 = str2.upper()
A = list(str1)
B = list(str2)

- 이제 위에서 만든 리스트를 탐색하면서 두 개의 문자로 짝지어서 새로운 배열로 만들어준다.

- 이후 마지막 원소를 삭제하도록 한다. 

- 현재 인덱스와 다음 인덱스가 가리키는 문자를 짝지었기 때문에 마지막 문자는 짝지어지지 못하고 남게되기 때문이다.

    for i in range(len(A) - 1):
        A[i] += A[i+1]
    for i in range(len(B) - 1):
        B[i] += B[i+1]
    A.pop()
    B.pop()

- 이제 A를 순환하면서 문자가 B에 들어있는지 판단하고 B에 포함되어있다면 교집합 리스트에 추가하고

- 해당 문자를 리스트 B에서 삭제한다.

- 그리고 매번 해당 문자를 합집합 리스트에 추가한다.

- 마지막으로 B에 남아있는 문자 중에 알파벳으로만 구성되어있는 문자를 합집합 리스트에 추가한다.

    gyo = []
    hap = []
    for a in A:
        if a.isalpha():
            if a in B:
                gyo.append(a)
                B.remove(a)
            hap.append(a)
    for b in B:
        if b.isalpha():
            hap.append(b)

- 교집합과 합집합이 모두 공집합이 아닐 때는 유사도를 계산하여 answer에 저장한다.

- 만약 교집합만 공집합이라면 answer는 0이 된다.

if gyo and hap:
        answer = math.floor((len(gyo) / len(hap)) * 65536) 
 elif not gyo and hap:
        answer = 0

전체 코드

import math
def solution(str1, str2):
    answer = 65536
    str1 = str1.upper()
    str2 = str2.upper()
    A = list(str1)
    B = list(str2)
    
    for i in range(len(A) - 1):
        A[i] += A[i+1]
    for i in range(len(B) - 1):
        B[i] += B[i+1]
    A.pop()
    B.pop()
    gyo = []
    hap = []
    for a in A:
        if a.isalpha():
            if a in B:
                gyo.append(a)
                B.remove(a)
            hap.append(a)
    for b in B:
        if b.isalpha():
            hap.append(b)

    if gyo and hap:
        answer = math.floor((len(gyo) / len(hap)) * 65536) 
    elif not gyo and hap:
        answer = 0
        
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 오픈채팅방  (0) 2021.08.30
[Level 2] 프렌즈 4블록  (0) 2021.08.29
[Level 1] 실패율  (0) 2021.08.03
[Level 1] 키패드 누르기  (0) 2021.07.31
[Level 1] 숫자 문자열과 영단어  (0) 2021.07.31