📖 문제
🧑🏻💻 풀이 과정
1) 문제 이해 및 접근
문자열을 특정 길이로 모두 자른 후 알파벳인 경우에만 판별을 하여야하므로 영문자를 판별하는 isalpha 메서드를 사용하였습니다.
단순히 집합을 이용하면 중복되는 문자들은 1개만 남게 되는데, 문제에서는 중복을 유지시켜야 했기 때문에 딕셔너리를 이용하여 중복을 유지시켰습니다.
2) 알고리즘
- 문자열
3) 풀이 코드
사용 언어 - Python
def solution(str1, str2):
one, two = {}, {} # 문자열들을 2글자씩 자른 갯수를 카운트하는 딕셔너리 변수
intersection = 0 # 교집합의 개수
union = 0 # 합집합의 개수
for i in range(1, len(str1)): # 첫번째 문자열의 두글자가 문자열로만 이루어져 있으면
if str1[i-1:i+1].isalpha(): # 딕셔너리에 없는 문자이면 키를 새로 생성하고, 1씩 증가
one[str1[i-1:i+1].lower()] = one.get(str1[i-1:i+1].lower(), 0) + 1
for i in range(1, len(str2)):
if str2[i-1:i+1].isalpha():
two[str2[i-1:i+1].lower()] = two.get(str2[i-1:i+1].lower(), 0) + 1
for k in set(list(one.keys()) + list(two.keys())): # 첫번째 문자열과 두번쨰 문자열의 키값들 서로 교집합 합집합 확인
intersection += min(one.get(k, 0), two.get(k, 0)) # 교집합의 개수 카운트
union += max(one.get(k, 0), two.get(k, 0)) # 합집합의 개수 카운트
if not union: # 합집합이 없으면 자카드 유사도는 1이 된다
return 65536
return int(intersection / union * 65536)
print(solution('FRANCE', 'french'))
print(solution('handshake', 'shake hands'))
print(solution('aa1+aa2', 'AAAA12'))
print(solution('E=M*C^2', 'e=m*c^2'))
📝 결과 및 학습한 내용
1) 어려웠던 내용
특별히 없습니다.
2) 새롭게 학습한 내용
특별히 없습니다.
🔗 문제 링크
- https://programmers.co.kr/learn/courses/30/lessons/17677
※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다
'알고리즘 문제풀이 > Python' 카테고리의 다른 글
[백준] 16398 행성 연결 (0) | 2022.02.03 |
---|---|
[백준] 1197 최소 스패닝 트리 (0) | 2022.02.02 |
[백준] 15686 치킨 배달 (0) | 2022.01.31 |
[백준] 3190 뱀 (0) | 2022.01.30 |
[백준] 18222 투에-모스 문자열 (0) | 2022.01.29 |
댓글