https://programmers.co.kr/learn/courses/30/lessons/17677
접근
다중 교집합과 합집합을 어떻게 구현할지를 결정하면 다른 조건은 쉽게 처리할 수 있었다. 먼저 나의 풀이에서는 문자열을 두 글자씩 끊어서 새로운 리스트를 생성한 후에 리스트 A에 있는 문자가 B에 있으면 교집합 리스트에 넣고 해당 문자를 B에서 삭제한다.. 이 과정에서 해당 문자가 알파벳이라면 합집합 리스트에 넣는다.
위의 과정을 거친 후에 B에는 A에 없는 문자만 남게되고 알파벳으로만 구성되어있는 문자를 합집합 리스트에 다시 추가한다.
이제 교집합과 합집합의 크기를 통해 유사도를 계산한다.
구현
- 전달받은 두 개의 문자열을 대문자로 변환하고
- A와 B에 리스트로 변환하여 저장한다.
str1 = str1.upper()
str2 = str2.upper()
A = list(str1)
B = list(str2)
- 이제 위에서 만든 리스트를 탐색하면서 두 개의 문자로 짝지어서 새로운 배열로 만들어준다.
- 이후 마지막 원소를 삭제하도록 한다.
- 현재 인덱스와 다음 인덱스가 가리키는 문자를 짝지었기 때문에 마지막 문자는 짝지어지지 못하고 남게되기 때문이다.
for i in range(len(A) - 1):
A[i] += A[i+1]
for i in range(len(B) - 1):
B[i] += B[i+1]
A.pop()
B.pop()
- 이제 A를 순환하면서 문자가 B에 들어있는지 판단하고 B에 포함되어있다면 교집합 리스트에 추가하고
- 해당 문자를 리스트 B에서 삭제한다.
- 그리고 매번 해당 문자를 합집합 리스트에 추가한다.
- 마지막으로 B에 남아있는 문자 중에 알파벳으로만 구성되어있는 문자를 합집합 리스트에 추가한다.
gyo = []
hap = []
for a in A:
if a.isalpha():
if a in B:
gyo.append(a)
B.remove(a)
hap.append(a)
for b in B:
if b.isalpha():
hap.append(b)
- 교집합과 합집합이 모두 공집합이 아닐 때는 유사도를 계산하여 answer에 저장한다.
- 만약 교집합만 공집합이라면 answer는 0이 된다.
if gyo and hap:
answer = math.floor((len(gyo) / len(hap)) * 65536)
elif not gyo and hap:
answer = 0
전체 코드
import math
def solution(str1, str2):
answer = 65536
str1 = str1.upper()
str2 = str2.upper()
A = list(str1)
B = list(str2)
for i in range(len(A) - 1):
A[i] += A[i+1]
for i in range(len(B) - 1):
B[i] += B[i+1]
A.pop()
B.pop()
gyo = []
hap = []
for a in A:
if a.isalpha():
if a in B:
gyo.append(a)
B.remove(a)
hap.append(a)
for b in B:
if b.isalpha():
hap.append(b)
if gyo and hap:
answer = math.floor((len(gyo) / len(hap)) * 65536)
elif not gyo and hap:
answer = 0
return answer
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[Level 2] 오픈채팅방 (0) | 2021.08.30 |
---|---|
[Level 2] 프렌즈 4블록 (0) | 2021.08.29 |
[Level 1] 실패율 (0) | 2021.08.03 |
[Level 1] 키패드 누르기 (0) | 2021.07.31 |
[Level 1] 숫자 문자열과 영단어 (0) | 2021.07.31 |