새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

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

by 언호 2022. 2. 1.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

문자열을 특정 길이로 모두 자른 후 알파벳인 경우에만 판별을 하여야하므로 영문자를 판별하는 isalpha 메서드를 사용하였습니다.

단순히 집합을 이용하면 중복되는 문자들은 1개만 남게 되는데, 문제에서는 중복을 유지시켜야 했기 때문에 딕셔너리를 이용하여 중복을 유지시켰습니다.

2) 알고리즘

  • 문자열

3) 풀이 코드

사용 언어 - Python

def solution(str1, str2):
    one, two = {}, {}       # 문자열들을 2글자씩 자른 갯수를 카운트하는 딕셔너리 변수
    intersection = 0        # 교집합의 개수
    union = 0               # 합집합의 개수

    for i in range(1, len(str1)):       # 첫번째 문자열의 두글자가 문자열로만 이루어져 있으면
        if str1[i-1:i+1].isalpha():     # 딕셔너리에 없는 문자이면 키를 새로 생성하고, 1씩 증가
            one[str1[i-1:i+1].lower()] = one.get(str1[i-1:i+1].lower(), 0) + 1
        
    for i in range(1, len(str2)):
        if str2[i-1:i+1].isalpha():
            two[str2[i-1:i+1].lower()] = two.get(str2[i-1:i+1].lower(), 0) + 1

    for k in set(list(one.keys()) + list(two.keys())):          # 첫번째 문자열과 두번쨰 문자열의 키값들 서로 교집합 합집합 확인
        intersection += min(one.get(k, 0), two.get(k, 0))       # 교집합의 개수 카운트
        union += max(one.get(k, 0), two.get(k, 0))              # 합집합의 개수 카운트


    if not union:           # 합집합이 없으면 자카드 유사도는 1이 된다
        return 65536
    return int(intersection / union * 65536)

print(solution('FRANCE', 'french'))
print(solution('handshake', 'shake hands'))
print(solution('aa1+aa2', 'AAAA12'))
print(solution('E=M*C^2', 'e=m*c^2'))

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

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

 

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

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

programmers.co.kr

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 16398 행성 연결  (0) 2022.02.03
[백준] 1197 최소 스패닝 트리  (0) 2022.02.02
[백준] 15686 치킨 배달  (0) 2022.01.31
[백준] 3190 뱀  (0) 2022.01.30
[백준] 18222 투에-모스 문자열  (0) 2022.01.29

댓글