출력 형식
입력으로 들어온 두 문자열의 자카드 유사도를 출력한다. 유사도 값은 0에서 1 사이의 실수이므로, 이를 다루기 쉽도록 65536을 곱한 후에 소수점 아래를 버리고 정수부만 출력한다.
2018 카카오 채용 문제다.
고려 사항
이 문제를 접하기 전까지 python 내에 알파벳을 구별하는 함수가 있는지 몰랐다.
isalpha(), isdigit(), isalnum()
c++로 해결할 땐 항상 ascii코드를 쓰거나 부등호로 비교를 했었다. 이에 반하면 참 파이썬은 편리한 스크립트언어다. 💯
그렇다면, 문제를 해결하기 위해서 우선 대소문자 구분이 없다고 했으니 모두 소문자로 만들어준다. -> lower()
str1 = str1.lower()
str2 = str2.lower()
후에 각 string을 순회하면서 판별해주면 되는데 여기에서 리스트 안의 값들을 딕셔너리형태로 바꾼 후 갯수를 count해주는 아주 편리한 함수가 python에 존재한다.
counter1 = Counter(str1_list)
counter2 = Counter(str2_list)
우리는 여기에서 key값에 해당하는 원소만 필요하기 때문에
counter1.elements()
위와 같이 원소만 추출해야한다.
따라서, 최종 코드는
from collections import Counter
def solution(str1, str2):
answer = 0
str1 = str1.lower()
str2 = str2.lower()
str1_list = []
str2_list = []
for i in range(len(str1)-1):
if str1[i].isalpha() and str1[i+1].isalpha():
str1_list.append(str1[i:i+2])
for j in range(len(str2)-1):
if str2[j].isalpha() and str2[j+1].isalpha():
str2_list.append(str2[j:j+2])
counter1 = Counter(str1_list)
counter2 = Counter(str2_list)
inter = list((counter1 & counter2).elements())
union = list((counter1 | counter2).elements())
if len(inter) == 0 and len(union) == 0:
return 65536
answer = int((len(inter) / len(union)) *65536)
return answer
파이썬은 사용할 수 있는 함수와 활용도가 증가하면 정말 고급코딩을 하기 쉬워질거같다.‼️