https://programmers.co.kr/learn/courses/30/lessons/17677
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
풀이 과정
2개의 문자열을 줄테니 문자열을 2글자씩 끊어서 자카드 유사도를 구하고, 65535를 곱하고 정수형으로 반환해달라는 문제이다.
upper(), lower(), isalnum(), isalpha(), isdigit() 등의 파이썬 내장함수를 알고 있다면 더 편하게 풀 수 있다.
문제에서 소문자, 대문자를 같게 취급하라 하였으니 문자열을 전부다 upper()로 대문자로 바꿔주고 시작했다.
문자열을 2글자씩 끊고, isalpha()로 알파벳이 아닌 것이 있으면 무시하고, 알파벳이면 딕셔너리에 넣으면서 문자열에서 몇번 나왔는지 체크해 주었다.
집합 a + 집합 b - a, b의 교집합 = a, b의 합집합임을 이용해서 딕셔너리를 순회하면서 집합 a, b와 합집합과 교집합을 구했다.
소스 코드
def solution(str1, str2):
string_dict = {}
string_dict2 = {}
str1 = str1.upper()
str2 = str2.upper()
for i in range(len(str1)-1):
string = str1[i] + str1[i+1]
if not string.isalpha():
continue
if string in string_dict:
string_dict[string] += 1
else:
string_dict[string] = 1
for i in range(len(str2)-1):
string = str2[i] + str2[i+1]
if not string.isalpha():
continue
if string in string_dict2:
string_dict2[string] += 1
else:
string_dict2[string] = 1
a_size = 0
b_size = 0
for i in string_dict.values():
a_size += i
for i in string_dict2.values():
b_size += i
kyo_size = 0
for i, j in string_dict.items():
if i in string_dict2:
kyo_size += min(j, string_dict2[i])
hap_size = a_size + b_size - kyo_size
return int(65536 * kyo_size / hap_size) if hap_size != 0 else 65536
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 튜플 [파이썬] (0) | 2022.07.21 |
---|---|
프로그래머스 - 짝지어 제거하기 [파이썬] (0) | 2022.07.02 |
프로그래머스 - 괄호 변환 [파이썬] (0) | 2022.07.02 |
프로그래머스 - 메뉴 리뉴얼 [파이썬] (0) | 2022.07.02 |
프로그래머스 - 실패율 [파이썬] (0) | 2022.07.01 |