티스토리 뷰

728x90

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

 

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

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

programmers.co.kr

 

  • 해설 :

영어, 숫자, 특수문자로 이루어진 문자열 str1과 str2가 주어질 때 이 두 집합의 교집합 크기를 합집합 크기로 나눈 값인 자카드 유사도를 측정하여 이 값에 65535를 곱하여 출력하면 된다. 이 때, 특수문자나 숫자는 모두 삭제하며 2글자씩 끊어서 만든 집합의 자카드 유사도를 측정해야 한다. 

 

 

 

  • 풀이 :

가장 먼저 두 문자열을 lower()하여 모두 소문자로 변환하였다. 

이후 자카드 유사도를 측정하기 위한 집합인 s1과 s2를 만들어 str1과 str2를 각각 변환하여 저장하였다. 

이 두 배열의 가장 앞을 가르키는 index인 lc와 rc를 사용하여 투포인터의 원리처럼 서로 같은 값이 나왔을 때, 사전순으로 s1이 앞에 있을 때, 뒤에 있을 때인 총 3가지 경우를 생각하여 lc와 rc를 증가시켜주었다. 또한 결합도를 측정하기 위해 합집합의 수를 측정하기 위한 union 변수와 교집합의 수를 측정하기 위한 inter 변수를 사용하여 상황에 맞게 증가시켜 주었다. 이후 inter값을 union값으로 나누어 출력해주었다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def solution(str1, str2):
    answer = 0
    str1 = str1.lower()
    str2 = str2.lower()
    s1 = []
    s2 = []
    union = 0
    inter = 0
    for i in range(len(str1)-1):
        if str1[i].isalpha() and str1[i+1].isalpha():
            s1.append(str1[i]+str1[i+1])
    for i in range(len(str2)-1):
        if str2[i].isalpha() and str2[i+1].isalpha():
            s2.append(str2[i]+str2[i+1])
    
    if not s1 and not s2:
        return 65536
    else:
        s1.sort()
        s2.sort()
        lc = 0
        rc = 0
        l1 = len(s1)
        l2 = len(s2)
        while lc < l1 and rc < l2:
            if s1[lc] < s2[rc]:
                lc += 1
                union += 1
            elif s1[lc] == s2[rc]:
                lc += 1
                rc += 1
                union += 1
                inter += 1
            else:
                rc += 1
                union += 1
        union += (l1-lc)+(l2-rc)
        
    
    return int((inter/union)*65536)
cs
320x100
댓글
© 2022 WonSeok, All rights reserved