[Python] 프로그래머스 lv2 - 뉴스 클러스터링
2024. 2. 1. 13:08ㆍ알고리즘/문제풀이
[Python] 프로그래머스 lv2 - 뉴스 클러스터링
코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
- 주어진 문자열(특수문자 제외)의 교집합과 합집합을 구해서 값을 구하는 문제이다
- 마지막 도출 값은 교집합/합집합*65536을 곱해주고 뒤에 소수점은 버려주는 것이 조건이다
풀이 코드
- 각각의 문자열의 부분집합 생성
- 2개의 문자를 가진 문자열을 생성한다. 이때 문자열에 특수문자가 끼어있는 경우 제외한다. -> isalpha() 사용
- 문자열의 경우 대소문자 구분없이 동일하다고 하였으므로 upper()를 사용하여 대문자로 통일
- 중복되는 원소가 존재하며 해당 원소를 고려해서 코드를 작성해야 한다
- 교집합을 구하는 과정에서 중복되는 원소는 개수에 맞게 들어갈 수 있도록 교집합에 추가하면서 비교 대상인 set2에서는 제외
- 합집합의 경우 길이가 필요하므로 각 리스트의 길이를 합산
- 만약 합집합의 길이가 0이라면 바로 65536 반환
import math
def create_multiset(s):
multiset = []
for i in range(len(s)-1):
tmp = s[i:i+2]
if tmp.isalpha():
multiset.append(tmp)
return multiset
def solution(str1, str2):
set1, set2 = create_multiset(str1.upper()), create_multiset(str2.upper())
# 교집합 계산
inter=[]
for i in set1:
if i in set2:
inter.append(i)
set2.remove(i)
# 합집합 계산
union = len(set1) + len(set2)
# 자카드 유사도 계산
if union == 0:
return 65536
else:
answer = len(inter) / union
return int(answer * 65536)
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] Programmers lv2 - 더 맵게 (0) | 2024.02.11 |
---|---|
[Python] 프로그래머스 lv3 - 가장 먼 노드 (0) | 2024.02.08 |
[Python] 프로그래머스 lv2 (2019 카카오 개발자 겨울 인턴쉽) - 튜플 (0) | 2024.01.31 |
[Python] 프로그래머스 lv2 - 타겟 넘버 (1) | 2024.01.03 |
[Python] 프로그래머스 lv2 - 소수 찾기 (1) | 2024.01.03 |