[programmers] 뉴스클러스터링(2018 카카오 블라인드 채용)

resilient

·

2021. 8. 30. 16:44

728x90
반응형

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

 

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

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

programmers.co.kr

  • 이 문제는 카카오 코딩 테스트 1번 문제답게 문자열을 다루는 문제이다.
  • 먼저 숫자 또한 기호를 제외한 알파벳 소문자, 대문자 만을 담아두는 리스트를 입력값 str1, str2 각각 2개를 만들어서 소문자, 대문자만 2개씩 끊어서 다중집합의 원소로 만들어준다.
  • 그리고 str1_list 와 str2_list를 대문자 소문자 상관없이 비교해주기 위해 upper() 함수를 사용해서 전부 대문자로 바꿔준다.
  • 그리고 Counter 라이브러리를 이용해서 각 원소와 원소의 개수를 반환해주는 str1_list_cnt와 str2_list_cnt를 만들어준다.
  • Counter 함수를 사용한 str1_list_cnt 와 str2_list_cnt를 elements() 함수를 사용해서 교집합과 합집합을 각각 구해준다.
  • 교집합의 개수가 0이고 합집합의 개수가 0 일 때는 1로 처리하므로 65536을 출력해주고,
    그 외에는 교집합의 개수에서 합집합의 개수를 나눠서 65536을 곱해주면 된다.
from collections import Counter

str1 = 'FRANCE'
str2 = 'french'

str1_list = []
str2_list = []

cursor1 = 0
while cursor1 < len(str1) - 1:
    temp = ''
    for i in range(cursor1,cursor1+2):
        if 65 <= ord(str1[i]) < 91 or 97 <= ord(str1[i]) < 123:
            temp += str1[i]
    if len(temp) < 2:
        temp = ''
    elif len(temp) == 2:
        str1_list.append(temp)
        temp = ''
    cursor1 += 1

cursor2 = 0
while cursor2 < len(str2) - 1:
    temp = ''
    for i in range(cursor2,cursor2+2):
        if 65 <= ord(str2[i]) < 91 or 97 <= ord(str2[i]) < 123:
            temp += str2[i]
    if len(temp) < 2:
        temp = ''
    elif len(temp) == 2:
        str2_list.append(temp)
        temp = ''
    cursor2 += 1

for i in range(len(str1_list)):
    str1_list[i] = str1_list[i].upper()
for i in range(len(str2_list)):
    str2_list[i] = str2_list[i].upper()

str1_list_cnt = Counter(str1_list)
str2_list_cnt = Counter(str2_list)

intersec = list((str1_list_cnt & str2_list_cnt).elements())

union = list((str1_list_cnt | str2_list_cnt).elements())


if len(intersec) == 0 and len(union) == 0:
    print(65536)
else:
    print(int(len(intersec)/len(union)*65536))

 

반응형