<[1차] 뉴스 클러스터링>
문제(출처: https://school.programmers.co.kr/learn/courses/30/lessons/17677)
문제 풀이
- my solution
import math
def solution(str1, str2):
answer = 0
A=[]
B=[]
x=[]
minus=[]
#str1, str2 두 글자씩 끊어서 list
for i in range(len(str1)-1):
if(str1[i].isalpha() and str1[i+1].isalpha()):
A.append(str1[i].lower()+""+str1[i+1].lower())
for i in range(len(str2)-1):
if(str2[i].isalpha() and str2[i+1].isalpha()):
B.append(str2[i].lower()+""+str2[i+1].lower())
x.append(str2[i].lower()+""+str2[i+1].lower())
for i in A: #교집합
if(i in x):
minus.append(i)
x.pop(x.index(i))
sumlist=[]
for i in A: #합집합
sumlist.append(i)
if(i in B):
B.pop(B.index(i))
sumlist=sumlist+B
if(len(minus)==0 and len(sumlist)==0): #모두 공집합일 경우
answer=1
else: #공집합이 아닐 경우
answer=len(minus)/len(sumlist)
answer=math.trunc(answer*65536) #버림
return answer
문제가 너무 길었지만 읽어보니 단순 입력으로 들어온 문자열 2개를 2 글자씩 끊어서
교집합과 합집합으로 만들어 계산하면 되는 문제였다.
1) str1, str2를 순회하며 2글자씩 끊어서 list에 추가
-> 2글자 모두 영문자로된 것만 유효하므로 isalpha를 통해 확인
-> 소문자, 대문자 모두 상관없으므로 lower을 통해 소문자로 통일
2) (교집합) str1을 2글자씩 끊어 넣은 list를 순회
2-1) 그 값이 str2를 2 글자씩 끊어 넣은 list에 존재한다면
-> 교집합 list에 추가
-> str2를 2글자씩 끊어 넣은 list에서 제거
3) (합집합) str1을 2글자씩 끊어 넣은 list를 순회
3-1) 합집합은 다 들어가야 하므로 합집합 list에 추가
3-2) 그 값이 str2를 2 글자씩 끊어 넣은 list에 존재한다면
-> str2를 2글자씩 끊어 넣은 list에서 제거
4) 합집합 list에 남은 B 값을 넣어줌
5) 모두 공집합인 경우 -> answer =1
6) 공집합이 아닌 경우 -> answer=(교집합 길이)/(합집합 길이)
7) answer에 65536을 곱한 후 버림한 값을 결과로 냄
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'🌞Algorithm > 🔥programmers' 카테고리의 다른 글
| [programmers] 타겟 넘버 (0) | 2021.04.04 |
|---|---|
| [programmers] 신규 아이디 추천 - 2021 KAKAO BLIND RECRUITMENT (0) | 2021.01.27 |
| [programmers] [1차] 캐시 - 2018 KAKAO BLIND RECRUITMENT (0) | 2021.01.19 |
| [programmers] 영어 끝말잇기 - Summer/Winter Coding(~2018) (0) | 2021.01.12 |
| [programmers] 짝지어 제거하기 - 2017 팁스타운 (0) | 2021.01.11 |