문제
https://programmers.co.kr/learn/courses/30/lessons/17677
나의 코드
def solution(str1, str2):
str1_dict={}
str2_dict={}
str1 = str1.upper()
str2 = str2.upper()
for i in range(len(str1)-1):
target = str1[i:i+2]
if target != ''.join(char for char in target if char.isalpha()):
continue
if target in str1_dict.keys():
str1_dict[target][0]+=1
else:
str1_dict[target]=[1]
print(str1_dict)
for i in range(len(str2)-1):
target = str2[i:i+2]
if target != ''.join(char for char in target if char.isalpha()):
continue
if target in str2_dict.keys():
str2_dict[target]+=1
else:
str2_dict[target]=1
for key in str2_dict.keys():
if key in str1_dict.keys():
str1_dict[key].append(str2_dict[key])
else:
str1_dict[key]=[str2_dict[key]]
num_1 = 0
num_2 = 0
for key in str1_dict.keys():
if len(str1_dict[key]) == 1:
num_2 += str1_dict[key][0]
else:
num_1 += min(str1_dict[key])
num_2 += max(str1_dict[key])
print(str2_dict)
print(str1_dict)
if(num_2==0):
return 1*65536
else:
return int((num_1/num_2)*65536)
해당 문제의 핵심은 문자열에서 조건에 맞게 나눠서 새로운 요소들을 만들고 각 요소 수를 count한 다음
두개의 string의 교집합, 합집합의 수를 판단하는 문제였다.
1번째 출력은 str1의 요소들에 대한 딕셔너리, 2번째 출력은 str2의 요소들에 대한 딕셔너리이다.
3번째 출력은 str1 딕셔너리에 str2요소들을 추가하는 경우다.
교집합은 num_1으로 표현했는데 딕셔너리 요소들에서 리스트 길이가 2이면 가작 작은 값을 누적해서 합하고,
합집합은 num_2으로 표현했는데 딕셔너리 요소들에서 리스트 길이가 1이면 누적 합, 2라면 둘 중 큰 값을 누적시킨다.
새로 알게된 점
1. string.isalpha() : string에 영어, 한글로만 이루어져 있다면 true, 아니면 false
2. string.isalnum() : string에 영어, 한글, 숫자로만 이루어져 있다면 true, 아니면 false
3. set들 끼리 & | 를 사용하는 방법
의 결과는
list는 사용할 수 없는 방법이다.
'공부-코딩테스트 > 코테풀이 - 자바, 파이썬' 카테고리의 다른 글
다음 큰 숫자 (프로그래머스, 코딩테스트) (0) | 2022.04.13 |
---|---|
구명보트 (코딩테스트, 프로그래머스, 파이썬) (0) | 2022.03.06 |
큰 수 만들기 (코딩테스트, 프로그래머스, 파이썬) (0) | 2022.02.24 |
카펫 (코딩테스트, 프로그래머스, 파이썬) (0) | 2022.02.21 |
방문 길이 (코딩테스트, 프로그래머스, 파이썬) (0) | 2022.02.20 |
댓글