문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
from collections import defaultdict
def split_str(str):
res = defaultdict(int)
str = str.upper()
for i in range(len(str) - 1):
tmp = str[i:i + 2]
if tmp.isalpha():
res[tmp] += 1
return res
def solution(str1, str2):
answer = 0
s1 = split_str(str1)
s2 = split_str(str2)
if len(s1) == 0 and len(s2) == 0: # 둘 다 공집합인 경우
return 65536
union_set = defaultdict(list)
for k, v in s1.items():
union_set[k].append(v)
for k, v in s2.items():
union_set[k].append(v)
inter, uni = 0, 0
for k, v in union_set.items():
if len(v) > 1: # 다른 문자열 집합에 아예 등장하지않은 경우 고려하기 위해
inter += min(v)
uni += max(v)
answer = int((inter / uni) * 65536)
return answer
- split_str() 함수를 만들어 주어진 문자열을 2글자씩 잘라서 딕셔너리에 몇 번 등장했는지 기록하여 리턴한다. 이때 딕셔너리의 키값은 2글자씩 잘라진 문자열이고 밸류 값이 등장 횟수이다.
- zero division 오류가 날 수 있으니 잘라진 문자열들이 둘 다 공집합인 경우를 미리 처리해준다.
- 잘라진 문자열과 그 등장횟수가 담긴 s1, s2에 대하여 순회하며 두 문자열에 있던 2글자 문자열들의 등장 횟수를 union_set이라는 딕셔너리에 리스트 형태로 각각 기록한다.
- 이제 교집합과 합집합의 원소의 개수를 구할 것인데, 문제설명에서 등장한대로 교집합의 원소의 개수는 union_set의 각 밸류값인 리스트에서 min값, max 값으로 구하면 된다. 이때 str1, str2에 둘 다 등장한 2글자 문자열의 경우에만 밸류 값으로 존재하는 리스트의 길이가 2일 것이다. 따라서 이 경우에만 교집합의 원소 개수를 리스트의 최소값으로 세고 아닌 경우는 0으로 세면 되므로 그냥 넘어가면 된다.
다른 사람들의 풀이를 보니 존재하는 2글자 문자열을 집합 형태로 중복없이 뽑아내고 이 문자열들의 등장 횟수를 카운트하여 하는 방식으로 많이 풀이한 것 같다.
def solution(str1, str2):
s1 = [str1[i:i+2].lower() for i in range(len(str1) - 1) if str1[i:i+2].isalpha()]
s2 = [str2[i:i+2].lower() for i in range(len(str2) - 1) if str2[i:i+2].isalpha()]
inter_set = set(s1) & set(s2)
union_set = set(s1) | set(s2)
if len(union_set) == 0:
return 65536
inter = sum([min(s1.count(i), s2.count(i)) for i in inter_set])
uni = sum([max(s1.count(u), s2.count(u)) for u in union_set])
return int((inter/uni) * 65536)
'문제풀이 > 자료구조' 카테고리의 다른 글
[Python/파이썬] 백준 10828번 스택 (0) | 2023.01.20 |
---|---|
[Python/파이썬] 프로그래머스 Summer/Winter Coding(~2018) 스킬트리 (0) | 2023.01.11 |
[Python] 백준 1918번 후위 표기식 (0) | 2022.07.27 |
[Python/파이썬] 백준 1620번 나는야 포켓몬 마스터 이다솜 (0) | 2022.03.11 |
[Python/파이썬] 백준 11723번 집합 (0) | 2022.03.11 |