문제 이해 : 5분

문제 풀이 : 45분

 

틀린 풀이 

def solution(str1, str2):
    str1 = chk_ascii(str1)
    str2 = chk_ascii(str2)

    str_1,str_2 = [],[]
    for i in range(len(str1)-1):
        str_1.append(str1[i:i+2])

    for i in range(len(str2)-1):
        str_2.append(str2[i:i+2])

    str_1_temp = str_1.copy()
    str_2_temp = str_2.copy()
    str_1_result = str_1.copy()

    #교집합
    inter = set(str_1) & set(str_2)
    print(inter)

    #합집합
    for i in str_2_temp:
        if i not in str_1_temp:
            str_1_result.append(i)
        else:
            str_1_temp.remove(i)
    print(str_1_result)
    return round(len(inter) / len(str_1_result) * 65536,0)

def chk_ascii(s):
    tmp = ''
    for i in s:
        if 97 <= ord(i) <=122 or 65<= ord(i) <= 90:
            tmp += i.upper()
    return tmp
    
결과 : 테케 2 / 4

생각한 과정

1. 알파벳만 걸러주고, 두 문자씩 나눠주기

2. 합집합 교집합 구하기

3. 결과값 연산하기

 

사실 여기서 조금만 고쳐주면 문제는 풀릴 수 있었다. 테케가 2개만 맞은 이유에 대해서 계속 코드를 둘러봤지만 알 수 없었다.

그런데 웬걸, 이문제는 문제를 제대로 이해하지 못했던 것이었다. 

왜 저런 결과가 나오는 지 제대로 분석하지 못해서 이런 사태가 나온 것이다...

 

'문자가 아닌 요소가 왔을 경우에는 그 쌍을 삭제한다.' 이 부분을 제대로 이해하지 않고 넘어가서 나온 사태였다

그런데 이걸 중간에 눈치챘을 수도 있는데 왜 그러지 않았나?

바로 네번재 테스트 케이스 때문이었다.  E=M*C^2 를 보면 E =, = M, M * ...등등 이런 식으로 나와서 아무것도 생성되지 않는다.

나는 뭐에 씌였는지 당연히 이러면 안되지!! 하면서 저 특수문자들을 모두 지워주고,,, 공백을 지우고...하면서 어떻게든 문자를 만들어 주려고 했던 것이 문제를 일으킨 것이다!

 

아주아주 중요한 교훈을 배워버렸다.

 

정답 풀이

from math import floor

def solution(str1, str2):
    str_1 = chk_ascii(str1)
    str_2 = chk_ascii(str2)
    
    # 교집합
    inter = list(set(str_1) & set(str_2))
    union = list(set(str_1) | set(str_2))

    inter_len = sum([min(str_1.count(a),str_2.count(a)) for a in inter])
    union_len = sum([max(str_1.count(a),str_2.count(a)) for a in union])
    
    if inter_len == 0 and union_len == 0 : return 65536
    
    answer = floor((inter_len/union_len)*65536)
    
    return answer

def chk_ascii(s):
    tmp = ''
    tmp_list = []
    for a,b in zip(s,s[1:]):
        tmp = a+b
        if tmp.isalpha():
            tmp_list.append(tmp.upper())
    return tmp_list

내가 한 것보다 깔끔해 보였다.

 

1. min과 max를 활용해주는 방법에 대해서는 생각해봤지만, 포기한 이유가 있었다. 바로 저 count부분을 해결해주지 못해서였다. 어떻게 저걸 집합으로 처리해줄 수 있을까가 문제였다. 왜냐하면 집합은 중복을 허용하지 않기 때문이다.. 이 특성에 너무 강하게 사로잡힌 나머지 저런 방식으로 해결해주는 것에 대해서는 생각하지도 못했다! 

합집합에 대해서 원래 리스트에서 count함수를 써서 집합의 단점을 극복한게 인상적이었다. 

 

2. isalpha라는 함수, zip을 활용해서 문자를 판단해준 것이 인상적이었다. for문에 슬라이싱을 해줘서 2중 for문을 만들어 주지 않는 센스까지 너무 멋있었다. 

 

배운점

1. 문제 조건을 똑바로 보기. 이해를 못했다면, 이해하지 못한 부분을 이해해야 문제를 풀 수 있다.

2. 당연한 것은 없다. 집합의 단점을 극복할 수 있고 2중 for문의 단점도 언제든 극복이 가능하다. 

3. count함수, isalpha 함수, zip, for문의 슬라이싱을 활용해 2중 for문을 줄여주기

복사했습니다!