[Python] 프로그래머스 lv2 - 뉴스 클러스터링

2024. 2. 1. 13:08알고리즘/문제풀이

[Python] 프로그래머스 lv2 - 뉴스 클러스터링

 

코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

문제 설명

문제 설명

입력값 및 출력 형식

 

  • 주어진 문자열(특수문자 제외)의 교집합과 합집합을 구해서 값을 구하는 문제이다
  • 마지막 도출 값은 교집합/합집합*65536을 곱해주고 뒤에 소수점은 버려주는 것이 조건이다

 

풀이 코드

 

  • 각각의 문자열의 부분집합 생성
    • 2개의 문자를 가진 문자열을 생성한다. 이때 문자열에 특수문자가 끼어있는 경우 제외한다. -> isalpha() 사용
    • 문자열의 경우 대소문자 구분없이 동일하다고 하였으므로 upper()를 사용하여 대문자로 통일
  • 중복되는 원소가 존재하며 해당 원소를 고려해서 코드를 작성해야 한다
    • 교집합을 구하는 과정에서 중복되는 원소는 개수에 맞게 들어갈 수 있도록 교집합에 추가하면서 비교 대상인 set2에서는 제외
  • 합집합의 경우 길이가 필요하므로 각 리스트의 길이를 합산
    • 만약 합집합의 길이가 0이라면 바로 65536 반환
import math

def create_multiset(s):
    multiset = []
    for i in range(len(s)-1):
        tmp = s[i:i+2]
        if tmp.isalpha():
            multiset.append(tmp)
    return multiset

def solution(str1, str2):
    set1, set2 = create_multiset(str1.upper()), create_multiset(str2.upper())
    
    # 교집합 계산
    inter=[]
    for i in set1:
        if i in set2:
            inter.append(i)
            set2.remove(i)

    # 합집합 계산
    union = len(set1) + len(set2)
    
    # 자카드 유사도 계산
    if union == 0:
        return 65536  
    else:
        answer = len(inter) / union
        return int(answer * 65536)