728x90
반응형
1. 문제 설명
2. 풀이과정
- 마지막 65536을 곱한 후 소수점 아래를 버림 할 때 floor() 함수를 사용하므로 math 모듈을 불러온다. import math
- 첫 번째 문자열의 다중집합 원소를 저장할 리스트를 생성한다. li1 = list()
- 인덱스 1번 원소부터 마지막 원소까지 살펴보며 for i in range(1, len(str1))
- 앞 글자를 포함해 두 글자씩 끊어 저장한다. word = str1[i - 1] + str1[i]
- 만약 저장한 글자가 영문자로만 구성되어 있으면 if (word.isalpha())
- 해당 글자를 소문자로 통일해 리스트에 추가한다. li1.append(word.lower())
- 같은 방식으로 두 번째 문자열도 진행한다. 우선 리스트를 생성한다. li2 = list()
- 마찬가지로 인덱스 1번 원소부터 마지막 원소까지 살펴보며 for i in range(1, len(str2))
- 앞 글자를 포함해 두 글자씩 끊어 저장한다. word = str2[i - 1] + str2[i]
- 만약 저장한 글자가 영문자로만 구성되어 있으면 if (word.isalpha())
- 해당 글자를 소문자로 통일해 리스트에 추가한다. li2.append(word.lower())
- 두 리스트의 교집합 결과를 저장할 리스트를 생성한다. intersection = list()
- 만약 첫 번째 문자열의 다중집합 원소 개수가 더 많거나 같으면 if (len(li1) >= len(li2))
- 첫 번째 문자열의 다중집합 원소를 합집합을 구할 리스트에 깊은 복사 한다. union = list(i for i in li1)
- 두 번째 문자열의 다중집합 원소를 하나씩 추출하며 for i in li2
- 만약 추출한 원소가 첫 번째 문자열의 다중집합 원소 리스트에 없으면 if (i not in li1)
- 추출한 원소를 합집합 리스트에 추가한다. union.append(i)
- 반면에 추출한 원소가 첫 번째 문자열의 다중집합 원소 리스트에 있으면 else
- 추출한 원소를 교집합 리스트에 추가하고 intersection.append(i)
- 첫 번째 문자열의 다중집합 원소 리스트에서 추출한 문자를 제거해 다음 원소의 중복을 피한다. li1.remove(i)
- 반면에 두 번째 문자열의 다중집합 원소 개수가 더 많으면 else
- 두 번째 문자열의 다중집합 원소를 합집합을 구할 리스트에 깊은 복사 한다. union = list(i for i in li2)
- 첫 번째 문자열의 다중집합 원소를 하나씩 추출하며 for i in li1
- 만약 추출한 원소가 두 번째 문자열의 다중집합 원소 리스트에 없으면 if (i not in li2)
- 추출한 원소를 합집합 리스트에 추가한다. union.append(i)
- 반면에 추출한 원소가 두 번째 문자열의 다중집합 원소 리스트에 있으면 else
- 추출한 원소를 교집합 리스트에 추가하고 intersection.append(i)
- 두 번째 문자열의 다중집합 원소 리스트에서 추출한 문자를 제거해 다음 원소의 중복을 피한다. li2.remove(i)
- 만약 합집합과 교집합이 모두 공집합일 경우 if (len(union) == 0) and (len(intersection) == 0)
- 0으로 나눌 수 없으므로 유사도를 1로 한다. similarity = 1
- 두 집합이 모두 공집합이 아니라면 else
- 유사도는 교집합의 크기를 합집합의 크기로 나눈 값이다. similarity = len(intersection) / len(union)
- 유사도에 65536을 곱한 결과의 버림 한 값을 저장한다. answer = math.floor(similarity * 65536)
반응형
3. 소스코드
import math
def solution(str1, str2):
answer = 0
li1 = list()
for i in range(1, len(str1)):
word = str1[i - 1] + str1[i]
if (word.isalpha()):
li1.append(word.lower())
li2 = list()
for i in range(1, len(str2)):
word = str2[i - 1] + str2[i]
if (word.isalpha()):
li2.append(word.lower())
intersection = list()
if (len(li1) >= len(li2)):
union = list(i for i in li1)
for i in li2:
if (i not in li1):
union.append(i)
else:
intersection.append(i)
li1.remove(i)
else:
union = list(i for i in li2)
for i in li1:
if (i not in li2):
union.append(i)
else:
intersection.append(i)
li2.remove(i)
if (len(union) == 0) and (len(intersection) == 0):
similarity = 1
else:
similarity = len(intersection) / len(union)
answer = math.floor(similarity * 65536)
return answer
728x90
반응형
'프로그래머스 > Python' 카테고리의 다른 글
[프로그래머스] 타겟 넘버 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.31 |
---|---|
[프로그래머스] 이중우선순위큐 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.30 |
[프로그래머스] 정수 삼각형 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.29 |
[프로그래머스] 피로도 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.28 |
[프로그래머스] 프로세스 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.26 |
[프로그래머스] 소수찾기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.25 |
[프로그래머스] 소수 만들기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.25 |
[프로그래머스] 할인 행사 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.24 |