본문 바로가기

알고리즘

[programmers] 뉴스 클러스터링


로직

1. one, two를 대문자로 통일한 후, 합집합, 교집합을 구한다.
   ** 문제점 : union, interaction set일 때 사용가능
            - set하게 되면 만약, one = ['AA', 'AA'], two = ['AA', 'AA', 'AA']라면 set_one = set_two = {'AA'}로 동일해진다
   ** 해결책 :
            1) Counter함수 사용해서 union, interaction를 사용한다.
            2) make_interaction함수를 만들어 교집합만 구하면 one, two, interaction(one, two)갯수로 합집합을 구한다.

 

나는 2)을 택했다.

 

코드 

def solution(str1, str2):

    def make_split(word):

        answer = []
        for i in range(len(word) - 1):
            w = word[i:i + 2]
            if w.isalpha():
                answer.append(w)

        return answer

    def make_intersection(one, two):
        answer = []
        for i in range(len(one)):
            for j in range(len(two)):
                if one[i] == two[j]:
                    answer.append(one[i])
                    del two[j]
                    break
                    
        return answer

    str1 = str1.upper()
    str2 = str2.upper()

    one = make_split(str1)
    two = make_split(str2)
    len_one = len(one)
    len_two = len(two)

    if len_one == 0 and len_two == 0:
        return 65536
        
    elif one == two:
        return 65536
        
    else:
        part = make_intersection(one, two)
        total = len_one + len_two - len(part)
        result = len(part) / total * 65536

        return int(result)

 

주의할 점

1. 무조건 set의 union, intersection 함수를 쓰려고 하지 말자.

2. del을 사용하려면 index로만 지울 수 있다(문자로는 불가) -> for문을 one, two 둘다 돌려야한다.

 

'알고리즘' 카테고리의 다른 글

[programmers] 파일명 정렬  (0) 2020.09.02
[programmers] 오픈채팅방  (0) 2020.09.01
[programmers] 튜플  (0) 2020.08.31
[programmers] 다트 게임  (0) 2020.08.31
[baekjoon] 14888. 연산자 끼워넣기  (0) 2020.08.19