https://school.programmers.co.kr/learn/courses/30/lessons/17677
- 나의 풀이(틀림)
# [1차] 뉴스 클러스터링
def solution(str1, str2):
import math
import re
str1 = str1.lower()
str2 = str2.lower()
str1 = re.sub(r'[^a-z]', ' ', str1)
str2 = re.sub(r'[^a-z]', ' ', str2)
set_1 = []
set_2 = []
for i in range(len(str1)-1):
str_comb_1 = str1[i:i+2]
if not ' ' in str_comb_1:
set_1.append(str_comb_1)
for j in range(len(str2)-1):
str_comb_2 = str2[j:j+2]
if not ' ' in str_comb_2:
set_2.append(str_comb_2)
union = 0
intersection = 0
for i, j in zip(set_1, set_2):
if i in set_2:
intersection += min(set_1.count(i), set_2.count(i))
union += max(set_1.count(i), set_2.count(i))
elif j in set_1:
intersection += min(set_1.count(j), set_2.count(j))
union += max(set_1.count(j), set_2.count(j))
else:
union += set_1.count(i)
union += set_2.count(j)
if union == intersection :
return 65536
else:
answer = math.floor((intersection / union) * 65536)
return answer
몇 가지 예제에서 틀리길래 왜 그런가... 하고 생각해봤는데 저 zip하는 부분에서 두 개의 리스트가 길이가 다르면 길이가 짧은 리스트 기준으로만 실행되는 걸 고려안해서 틀렸음...
왜 틀렸는지 한참 찾았네
- 다른 풀이(맞음)
import re
import math
def solution(str1, str2):
str1 = [str1[i:i+2].lower() for i in range(0, len(str1)-1) if not re.findall('[^a-zA-Z]+', str1[i:i+2])]
str2 = [str2[i:i+2].lower() for i in range(0, len(str2)-1) if not re.findall('[^a-zA-Z]+', str2[i:i+2])]
gyo = set(str1) & set(str2)
hap = set(str1) | set(str2)
if len(hap) == 0 :
return 65536
gyo_sum = sum([min(str1.count(gg), str2.count(gg)) for gg in gyo])
hap_sum = sum([max(str1.count(hh), str2.count(hh)) for hh in hap])
return math.floor((gyo_sum/hap_sum)*65536)
set으로 바꿔버리면 중복이 제거되는데
밑에서 따로 개수를 구해버리면 되는거였음.... ㅎㅎ
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Python] 콜라 문제 (0) | 2022.12.30 |
---|---|
[Python] 소수 만들기 (0) | 2022.12.29 |
[Python] 프린터 (0) | 2022.12.24 |
[Python] 모의 고사 (0) | 2022.12.23 |
[Python] 소수 찾기 (0) | 2022.12.21 |