내 풀이
def solution(str1, str2):
comp1=[]
comp2=[]
a=[]
b=[]
str1 = str1.lower()
str2 = str2.lower()
for i in range(0,len(str1)-1):
if (str1[i]+str1[i+1]).isalpha():
comp1.append(str1[i]+str1[i+1])
for i in range(0,len(str2)-1):
if(str2[i]+str2[i+1]).isalpha():
comp2.append(str2[i]+str2[i+1])
for i in comp1:
temp= min(comp1.count(i),comp2.count(i))
if i in comp2:
if a.count(i) == temp:
continue
else:
a.append(i)
for i in comp1:
maxs = max(comp1.count(i),comp2.count(i))
if b.count(i) == maxs:
continue
else:
b.append(i)
for i in comp2:
maxs = max(comp1.count(i),comp2.count(i))
if b.count(i) == maxs:
continue
else:
b.append(i)
print(a,b)
hap = len(a) / len(b)
if len(a) == len(b) == 0:
return 65536
answer= int(65536*(hap ))
return answer
def solution(str1, str2):
comp1=[]
comp2=[]
str1 = str1.lower()
str2 = str2.lower()
for i in range(0,len(str1)-1):
if (str1[i]+str1[i+1]).isalpha():
comp1.append(str1[i]+str1[i+1])
for i in range(0,len(str2)-1):
if(str2[i]+str2[i+1]).isalpha():
comp2.append(str2[i]+str2[i+1])
gyo = set(comp1) & set(comp2)
hap = set(comp1) | set(comp2)
if len(gyo) == len(hap) == 0:
return 65536
gyo_s = sum([min(comp1.count(i),comp2.count(i)) for i in gyo])
hap_s = sum([max(comp1.count(i),comp2.count(i)) for i in hap])
answer= int(65536*(gyo_s/hap_s ))
return answer
두가지 정도로 풀어봤다.
결과적으로 둘다 어지러운 코드인건 맞는데
첫 번째 풀이는 그냥 어거지로 푼 느낌이다. 주어진 조건에 따라서 그냥 코딩한거 느낌이 물씬난다.
하나도 파이써닉하지 않다.
그렇다고 두번째가 파이써닉하단건 아닌데, 나름대로는 머리를 쓴 풀이다.
최초에 문제풀때는
ab bc cd 가 아니라
ab cd 이런식인줄 알고 실컷 풀었더니 자꾸 오류나서 정규화로는 안되나? 하고 포기했었는데
나중에 보니까 문제를 잘못 읽은거였다. 시간이 난다면 정규화로 푼 버전도 업데이트 해봐야 겠다.
다른사람의 풀이
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)
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
1번 풀이가 가장 좋아요를 많이 받은풀이인데
개인적으로는 이게 더 깔끔해보여서 갖고 와봤다.
풀면 풀수록 Counter는 활용할 곳이 많은 모듈같다.
솔직히 레벨 2 푼거 중에 젤 오래걸렸다 시험기간인데 시간을 너무 오래 버린거같다는 생각이 들기도 하지만..
이거 안했어도 공부 안했을꺼라고 생각하니까 나쁘진 않은거 같기도하다.
'취준 > 프로그래머스' 카테고리의 다른 글
프린터 - 파이썬 (0) | 2022.06.27 |
---|---|
튜플 - 파이썬 (0) | 2022.06.23 |
괄호 변환 - 파이썬 (0) | 2022.06.13 |
메뉴 리뉴얼 - 파이썬 (0) | 2022.06.06 |
행렬 테두리 회전하기 - 파이썬 (0) | 2022.06.06 |