[알고리즘 문제풀이] 프로그래머스 - 뉴스 클러스터링
풀이
- 입력받은 문자열을 두 문자씩 끊어 문자인지 검사한다.
- 합집합, 교집합을 구한다.
- 자카드 유사도를 계산한다.
코드
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)
를 사용하면 합집합, 교집합을 구할 수 있다. 다만, 이 문제에서는 다중 합집합을 허용하고 있으므로 이 방법은 중복 값을 모두 제거해버려 부적합하다.
Author And Source
이 문제에 관하여([알고리즘 문제풀이] 프로그래머스 - 뉴스 클러스터링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@newdana01/알고리즘-문제풀이-프로그래머스-뉴스-클러스터링저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)