문제
https://programmers.co.kr/learn/courses/30/lessons/17677
풀이
알고리즘은 따로 고민할 것이 없었고 문제에 주어진 그대록 구현하는 문제였다.
간단히 하자면 다음과 같다.
- 두 자씩 잘라 리스트에 넣는다.
- 영문자 아닌건 버린다.
- 두 리스트의 교집합을 합집합으로 나눈다.
def solution(str1, str2):
sp_str1 = []
sp_str2 = []
for i in range(1, len(str1)):
if (str1[i-1] + str1[i]).isalpha():
sp_str1.append((str1[i-1] + str1[i]).lower())
for i in range(1, len(str2)):
if (str2[i-1] + str2[i]).isalpha():
sp_str2.append((str2[i-1] + str2[i]).lower())
#다중집합의 합집합
tem_sp1 = sp_str1.copy()
union = sp_str1.copy()
for s2 in sp_str2:
if s2 in tem_sp1:
tem_sp1.remove(s2)
else:
union.append(s2)
#다중집합의 교집합
intersec = []
tem_sp1 = sp_str1.copy()
for s2 in sp_str2:
if s2 in tem_sp1:
intersec.append(s2)
tem_sp1.remove(s2)
if len(union) == 0:
return 65536
return int(len(intersec)/len(union)*65536)
처음에 영문자 아닌 것을 버리는 단계에서 정규식을 사용해야 하는 줄 알았다.
그래서 match()등을 찾아봤는데 알고보니 isalpha()라는 완전 간편한 함수가 있었다. ㅎ
파이썬에 set이라는 자료형(?)이 있는 것을 알고 있었다.
교집합과 합집합을 쉽게 구해주는데, 중복을 제거하기 때문에 이번 문제에서 원하는 바와는 맞지 않았다.
혹시 다른 쉬운 방법이 있나 검색해보았는데 그냥 직접 만들길래 별다른 방법이 없는 것 같아 나도 직접 했다.
다른 사람의 풀이
import re
import math
def solution(str1, str2):
str1 = [str1[i:i+2].lower() for i in range(0, len(str1)-1) if not re.findall('[^a-zA-Z]+', str1[i:i+2])]
str2 = [str2[i:i+2].lower() for i in range(0, len(str2)-1) if not re.findall('[^a-zA-Z]+', str2[i:i+2])]
gyo = set(str1) & set(str2)
hap = set(str1) | set(str2)
if len(hap) == 0 :
return 65536
gyo_sum = sum([min(str1.count(gg), str2.count(gg)) for gg in gyo])
hap_sum = sum([max(str1.count(hh), str2.count(hh)) for hh in hap])
return math.floor((gyo_sum/hap_sum)*65536)
완전 파이썬 잘알..
이분은 isalpha() 대신 정규식을 사용하였다.
set을 사용하고 min과 max로 다중합집합, 교집합 뽑아낸 부분이 천재적..
'알고리즘 스터디 2021.07~' 카테고리의 다른 글
[프로그래머스] 2020 카카오 블라인드 - 괄호 변환 (0) | 2021.08.22 |
---|---|
[프로그래머스] 2020 카카오 인턴십 - 키패드 누르기 (0) | 2021.08.10 |
[프로그래머스] 2020 카카오 인턴십 수식 최대화 (0) | 2021.08.07 |
[프로그래머스] 2018 카카오 블라인드 - [1차] 추석 트래픽 (0) | 2021.07.16 |
[프로그래머스] 2019 카카오 겨울인턴 - 크레인 인형뽑기 (2) | 2021.07.16 |