문제 링크
내 풀이
# 집합 => 원소 중복 허용하는 다중집합
# 다중합집합, 다중교집합
# 영문자로 된 글자 쌍만 유효
# "AB"와 "Ab", "ab"는 같은 원소로 취급
# 두글자씩 자르면서 리스트에 append하는데 혹시 영문자 제외 다른 것이 들어있을 경우
# append 하지 않는다
# 영문자로 구성된것이 확인되면 append 할때 .lower()로 소문자화 후 넣는다
def solution(str1, str2):
i, j = 0, 0
s1_list, s2_list = [], []
while i < len(str1) - 1:
s1 = str1[i:i+2]
if s1.isalpha():
s1_list.append(s1.lower())
i += 1
while j < len(str2) - 1:
s2 = str2[j:j+2]
if s2.isalpha():
s2_list.append(s2.lower())
j += 1
s1_list_temp = s1_list.copy()
s1_list_result = s1_list.copy()
for word in s2_list:
if word not in s1_list_temp:
s1_list_result.append(word)
else:
s1_list_temp.remove(word)
gyo = []
for word in s2_list:
if word in s1_list:
gyo.append(word)
s1_list.remove(word)
if len(s1_list_result) == 0:
return 65536
else:
answer = len(gyo) / len(s1_list_result)
return int(answer * 65536)
다른 풀이
from collections import Counter
def solution(str1, str2):
# make sets
s1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
s2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
if not s1 and not s2:
return 65536
c1 = Counter(s1)
c2 = Counter(s2)
answer = int(float(sum((c1&c2).values()))/float(sum((c1|c2).values())) * 65536)
return answer
풀이 해석
- list comprehension 을 통해 s1, s2를 표현하였음
- Counter 함수를 이용해 각각의 중복된 함수를 표현하고
- 합집합 차집합을 통해 각각의 갯수를 갱신하였다
- 그 후 합집합, 교집합 한 values의 합을 이용해 answer를 도출하였다
배울 점
- 리스트 컴프리핸션의 사용
- Counter함수에서 합집합, 교집합 이용하기
댓글남기기