내 풀이

 

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

+ Recent posts