[알고리즘 문제풀이] 프로그래머스 - 뉴스 클러스터링

나른한 개발자·2022년 4월 19일
0

문제풀이

목록 보기
12/13

풀이

  • 입력받은 문자열을 두 문자씩 끊어 문자인지 검사한다.
  • 합집합, 교집합을 구한다.
  • 자카드 유사도를 계산한다.

코드

from collections import Counter

def solution(str1:str , str2: str) -> int:
    sList1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
    sList2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
    
    Counter1 = Counter(sList1)
    Counter2 = Counter(sList2)
    
    inter = list((Counter1 & Counter2).elements())
    union = list((Counter1 | Counter2).elements())

    return 65536 if len(sList1) == 0 and len(sList2) == 0 else int(len(inter) / len(union) * 65536)

print(solution('FRANCE', 'french'))
print(solution('handshake', 'shake hands'))
print(solution('aa1+aa2', 'AAAA12'))
print(solution('E=M*C^2', 'e=m*c^2'))

새롭게 알게 된 것

  • isalpha(): 문자열인지 확인하고 True/False를 반환한다. 중간에 문자가 아닌 숫자 또는 공백이 있으면 False 반환
    -> 처음에는 정규 표현식으로 알파벳인지의 여부를 판단하려 했었다. 하지만 isalpha()를 쓰면 정규표현식을 쓰지 않고도 매우 간단하게 문자 여부 판단이 가능하다! 비슷하게 isdigit(), isalnum()이 있으니 참고하면 좋을 것 같다.

  • 교집합 / 합집합 구하기
    (1) Counter()를 이용한 방법:
    -> Counter()는 인자로 전달한 문자열 중 문자를 key로, 문자의 개수를 value로 하여 dictionary로 반환해주는 함수이다. dictionary를 확장하고 있기 때문에 딕셔너리 API를 모두 쓸 수 있으며 집합구조를 생성할 수 있다. 위 코드에서는 딕셔너리 형태에서 원소 값(key)값만 필요하므로 elements()를 이용하여 원소만 추출했다.
    (2) set 을 이용한 방법:
    -> set(sList1) & set(sList2) , set(sList1) | set(sList2) 를 사용하면 합집합, 교집합을 구할 수 있다. 다만, 이 문제에서는 다중 합집합을 허용하고 있으므로 이 방법은 중복 값을 모두 제거해버려 부적합하다.

profile
Start fast to fail fast

0개의 댓글