https://programmers.co.kr/learn/courses/30/lessons/17677
✔ 풀이
lower함수로 전체 소문자 만들어주기
isalpha함수로 알파벳이 아닌 문자 제거
def solution(str1, str2):
m1, m2 = [], []
str1 = str1.lower()
str2 = str2.lower()
for i in range(len(str1)-2):
if str1[i:i+2].isalpha():
m1.append(str1[i:i+2])
if str1[len(str1)-2:].isalpha():
m1.append(str1[len(str1)-2:])
for i in range(len(str2)-2):
if str2[i:i+2].isalpha():
m2.append(str2[i:i+2])
if str2[len(str2)-2:].isalpha():
m2.append(str2[len(str2)-2:])
inter, uni = 0, len(m1) + len(m2)
for s in m1:
if s in m2:
inter += 1
m2.remove(s)
if uni == 0:
return 65536
else:
return int((inter / (uni - inter)) * 65536)
코드가 겁나 긴데.. re모듈을 활용하면 짧게 가능하다.
✔ 다른코드 풀이
if not re.findall('[^a-zA-Z]+', str1[i:i+2]) #알파벳을 제외한 문자가 있다면 배열에 넣지 않음
gyo = set(str1) & set(str2) #set으로 형변환하고 교집합을 구한다.
hap = set(str1) | set(str2) #set으로 형변환하고 합집합을 구한다.
sum([min(str1.count(gg), str2.count(gg)) for gg in gyo]) #set으로 형변환될때 중복인 원소들이 없어졌기 때문에 실제 교집합의 크기를 구한다.
sum([max(str1.count(hh), str2.count(hh)) for hh in hap]) #set으로 형변환될때 중복인 원소들이 없어졌기 때문에 실제 합집합의 크기를 구한다.
import re
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 int((gyo_sum/hap_sum)*65536)
'알고리즘 > 프로그래머스(Python)' 카테고리의 다른 글
[알고리즘] 프로그래머스 비밀지도 / python, 비트연산자 (0) | 2020.05.07 |
---|---|
[알고리즘] 프로그래머스 프렌즈4블록 / python (0) | 2020.05.06 |
[알고리즘] 프로그래머스 징검다리 건너기 / python (0) | 2020.05.04 |
[알고리즘] 프로그래머스 튜플 / python (0) | 2020.04.28 |
[알고리즘] 프로그래머스 크레인 인형뽑기 게임 / python (0) | 2020.04.25 |