🌞Algorithm/🔥programmers

[programmers] [1차] 뉴스 클러스터링 - 2018 KAKAO BLIND RECRUITMENT

뿌야._. 2021. 1. 19. 17:06

<[1차] 뉴스 클러스터링>

 

문제(출처: https://school.programmers.co.kr/learn/courses/30/lessons/17677)

 

 

 

문제 풀이

   - my solution

 

import math
def solution(str1, str2):
    answer = 0
    
    A=[]
    B=[]
    x=[]
    minus=[]
    
    #str1, str2 두 글자씩 끊어서 list 
    for i in range(len(str1)-1):
        if(str1[i].isalpha() and str1[i+1].isalpha()):
            A.append(str1[i].lower()+""+str1[i+1].lower())
    for i in range(len(str2)-1):
        if(str2[i].isalpha() and str2[i+1].isalpha()):
            B.append(str2[i].lower()+""+str2[i+1].lower())
            x.append(str2[i].lower()+""+str2[i+1].lower())
    
    for i in A: #교집합
        if(i in x):
            minus.append(i)
            x.pop(x.index(i))
    
    sumlist=[]
    
    for i in A: #합집합
        sumlist.append(i)
        if(i in B):
            B.pop(B.index(i))
    sumlist=sumlist+B
    
    
    if(len(minus)==0 and len(sumlist)==0): #모두 공집합일 경우
        answer=1
    else: #공집합이 아닐 경우
        answer=len(minus)/len(sumlist)
    answer=math.trunc(answer*65536) #버림
    
    return answer

 문제가 너무 길었지만 읽어보니 단순 입력으로 들어온 문자열 2개를 2 글자씩 끊어서

 교집합과 합집합으로 만들어 계산하면 되는 문제였다.

 

 1) str1, str2를 순회하며 2글자씩 끊어서 list에 추가

     -> 2글자 모두 영문자로된 것만 유효하므로 isalpha를 통해 확인

     -> 소문자, 대문자 모두 상관없으므로 lower을 통해 소문자로 통일

 2) (교집합) str1을 2글자씩 끊어 넣은 list를 순회

    2-1) 그 값이 str2를 2 글자씩 끊어 넣은 list에 존재한다면 

            -> 교집합 list에 추가 

            -> str2를 2글자씩 끊어 넣은 list에서 제거

 3) (합집합) str1을 2글자씩 끊어 넣은 list를 순회

    3-1) 합집합은 다 들어가야 하므로 합집합 list에 추가

    3-2) 그 값이 str2를 2 글자씩 끊어 넣은 list에 존재한다면

            -> str2를 2글자씩 끊어 넣은 list에서 제거

 4) 합집합 list에 남은 B 값을 넣어줌

 5) 모두 공집합인 경우 -> answer =1

 6) 공집합이 아닌 경우 -> answer=(교집합 길이)/(합집합 길이)

 7) answer에 65536을 곱한 후 버림한 값을 결과로 냄


출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges