평범한 필기장

[Programmers_Python] 뉴스 클러스터링 본문

코딩 테스트 준비/Programmers

[Programmers_Python] 뉴스 클러스터링

junseok-rh 2023. 3. 30. 15:11

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

내 풀이방식

  • 입력으로 들어오는 문자열을 소문자로 바꾸고 i번째와 i+1번째 문자 둘다 알파벳일 때 리스트에 넣는다.
  • 리스트 둘 다 빈 리스트면 65536이 return되게 한다.
  • 아니면 공통된 문자열들은 intersection에 넣고, 모든 문자열들을 union에 넣는다

문제점 : 여러번 나오는 문자열들을 intersection에는 적게 나온 횟수만큼, union에는 많이 나온 횟수만큼 넣어야 하는데 어떻게 처리해야할지 몰라서 못풀었다,,,

def solution(str1, str2):
    str1 = str1.lower()
    str2 = str2.lower()
    str1_lst = []
    str2_lst = []
    for i in range(len(str1) - 1):
        if 97<=ord(str1[i])<=122 and 97<=ord(str1[i+1])<=122:
            str1_lst.append(str1[i] + str1[i+1])
    for i in range(len(str2) - 1):
        if 97<=ord(str2[i])<=122 and 97<=ord(str2[i+1])<=122:
            str2_lst.append(str2[i] + str2[i+1])
    print(str1_lst)
    print(str2_lst)
    if len(str1_lst) == 0 and len(str2_lst) == 0:
        answer = 1
    else:
        intersection = []
        union = []
        for k in str1_lst:
            if k in str2_lst and k not in intersection:
                intersection.append(k)
            elif k not in union:
                union.append(k)
        for k in str2_lst:
            if k in str1_lst and k not in intersection:
                intersection.append(k)
            elif k not in union:
                union.append(k)
        print(union)
        print(intersection)
        answer = len(intersection)/len(union)
    return answer * 65536

정답 코드

 

  1. Counter라는 함수를 통해 리스트내에 어떤 원소가 몇번 나오는지를 나타내는 딕셔너리를 만들 수 있다.
  2. 아스키코드보다 .isalpha()를 이용하는게 훨씬 간편하다.
from collections import Counter 

def solution(str1, str2):
    str1 = str1.lower()
    str2 = str2.lower()
    str1_lst = []
    str2_lst = []
    for i in range(len(str1)-1):
        if str1[i].isalpha() and str1[i+1].isalpha():
            str1_lst.append(str1[i:i+2])
    for i in range(len(str2)-1):
        if str2[i].isalpha() and str2[i+1].isalpha():
            str2_lst.append(str2[i:i+2])
            
    str1_cnt = Counter(str1_lst)
    str2_cnt = Counter(str2_lst)
    union = sum((str1_cnt | str2_cnt).values())
    interaction = sum((str1_cnt & str2_cnt).values())
    if union == 0 and interaction == 0:
        return 65536
    else:
        return int(65536 * (interaction/union))

 

 코테 문제를 푼 경험이 많지 않아서 Counter라는 함수를 쓰거나 .isalpha()를 쓸 생각을 문제 풀때 생각을 하지 못했다. 코테를 보기 전에 코테 경험을 많이 쌓아야겠다는 생각이 또 드는 문제였던 것 같다,,,