뉴스 클러스터링

zzwwoonn·2022년 6월 24일
0

Algorithm

목록 보기
61/71

첫 번째 풀이

from curses.ascii import isalpha


# str1 = "FRANCE"
# str2 = "french"
# 16384

str1 = "handshake"
str2 = "shake hands"
# 65536

# str1 = "aa1+aa2"
# str2 = "AAAA12"
# 43690

# str1 = "E=M*C^2"
# str2 = "e=m*c^2"
# 65536

def solution(str1, str2):
    answer = 0
    A = []
    B = []
    for i in range(len(str1)-1):
        if isalpha(str1[i]) and isalpha(str1[i+1]):
            x = str1[i].upper() + str1[i+1].upper()
            A.append(x)
    for i in range(len(str2)-1):
        if isalpha(str2[i]) and isalpha(str2[i+1]):
            x = str2[i].upper() + str2[i+1].upper()
            B.append(x)
    # A = ['FR', 'RA', 'AN', 'NC', 'CE']
    # B = ['FR', 'RE', 'EN', 'NC', 'CH']
    #  교집합은 {FR, NC}, 
    #  합집합은 {FR, RA, AN, NC, CE, RE, EN, CH}

    print("A = ", A)
    print("B = ", B)
   
    C = []
    
    for a in A:
        if a in B:
            A.remove(a)
            B.remove(a)
            C.append(a)
    print("1. A = ", A)
    print("1. B = ", B)
    print("1. C = ", C)


    num1 = len(A)
    num2 = len(C)
    num3 = len(B)

    answer = int(num2 / (num1+num2+num3) * 65536)
    return answer

print(solution(str1, str2))

A = ["11", "11", "12"]
B = ["11", "13"]

위의 예시로 교집합을 구하는 과정에서 A의 11이라는 원소가 B에도 있어서 교집합을 구할 수 있을까 싶지만 A에 11이 2개 있을 땐 예외가 발생

두 번째 풀이

from curses.ascii import isalpha
from math import floor

def solution(str1, str2):
    answer = 0
    A = []
    B = []
    for i in range(len(str1)-1):
        if isalpha(str1[i]) and isalpha(str1[i+1]):
            x = str1[i].upper() + str1[i+1].upper()
            A.append(x)
    for i in range(len(str2)-1):
        if isalpha(str2[i]) and isalpha(str2[i+1]):
            x = str2[i].upper() + str2[i+1].upper()
            B.append(x)
    if len(A) == 0 and len(B) == 0:
        return 65536
    
    Adict = dict()
    Bdict = dict()
    
        
    for a in A:
        if a not in Adict.keys():
            Adict[a] = 1
        else:
            Adict[a] += 1
    for b in B:
        if b not in Bdict.keys():
            Bdict[b] = 1
        else:
            Bdict[b] += 1
    
    # print("Adict = ", Adict)
    # print("Bdict = ", Bdict)

    num1 = 0
    num2 = 0

    for a in Adict.keys():
        if a in Bdict.keys():
            num1 += min(Adict[a], Bdict[a])
            
    for a in Adict.keys():
        if a in Bdict.keys():
            num2 += max(Adict[a], Bdict[a])
            Bdict[a] = 0
        else:
            num2 += Adict[a]

    for b in Bdict.keys():
        num2 += Bdict[b]

    answer = floor(num1 / num2 * 65536)
    return answer

5번 테스트 케이스가 계속 틀렸다 나왔다.

if len(A) == 0 or len(B) == 0: 

위의 코드를

if len(A) == 0 and len(B) == 0:

으로 바꿔줘서 해결했다.
5번 케이스는 교집합은 없지만 합집합이 있는 경우였다. and 를 or로 바꿔줘서 해결.

0개의 댓글