본문 바로가기
프로그래머스/Python

[프로그래머스] [1차] 뉴스 클러스터링 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 27.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

  1. 마지막 65536을 곱한 후 소수점 아래를 버림 할 때 floor() 함수를 사용하므로 math 모듈을 불러온다. import math
  2. 첫 번째 문자열의 다중집합 원소를 저장할 리스트를 생성한다. li1 = list()
  3. 인덱스 1번 원소부터 마지막 원소까지 살펴보며 for i in range(1, len(str1))
  4. 앞 글자를 포함해 두 글자씩 끊어 저장한다. word = str1[i - 1] + str1[i]
  5. 만약 저장한 글자가 영문자로만 구성되어 있으면 if (word.isalpha())
  6. 해당 글자를 소문자로 통일해 리스트에 추가한다. li1.append(word.lower())
  7. 같은 방식으로 두 번째 문자열도 진행한다. 우선 리스트를 생성한다. li2 = list()
  8. 마찬가지로 인덱스 1번 원소부터 마지막 원소까지 살펴보며 for i in range(1, len(str2))
  9. 앞 글자를 포함해 두 글자씩 끊어 저장한다. word = str2[i - 1] + str2[i]
  10. 만약 저장한 글자가 영문자로만 구성되어 있으면 if (word.isalpha())
  11. 해당 글자를 소문자로 통일해 리스트에 추가한다. li2.append(word.lower())
  12. 두 리스트의 교집합 결과를 저장할 리스트를 생성한다. intersection = list()
  13. 만약 첫 번째 문자열의 다중집합 원소 개수가 더 많거나 같으면 if (len(li1) >= len(li2))
  14. 첫 번째 문자열의 다중집합 원소를 합집합을 구할 리스트에 깊은 복사 한다. union = list(i for i in li1)
  15. 두 번째 문자열의 다중집합 원소를 하나씩 추출하며 for i in li2
  16. 만약 추출한 원소가 첫 번째 문자열의 다중집합 원소 리스트에 없으면 if (i not in li1)
  17. 추출한 원소를 합집합 리스트에 추가한다. union.append(i)
  18. 반면에 추출한 원소가 첫 번째 문자열의 다중집합 원소 리스트에 있으면 else
  19. 추출한 원소를 교집합 리스트에 추가하고 intersection.append(i)
  20. 첫 번째 문자열의 다중집합 원소 리스트에서 추출한 문자를 제거해 다음 원소의 중복을 피한다. li1.remove(i)
  21. 반면에 두 번째 문자열의 다중집합 원소 개수가 더 많으면 else
  22. 두 번째 문자열의 다중집합 원소를 합집합을 구할 리스트에 깊은 복사 한다. union = list(i for i in li2)
  23. 첫 번째 문자열의 다중집합 원소를 하나씩 추출하며 for i in li1
  24. 만약 추출한 원소가 두 번째 문자열의 다중집합 원소 리스트에 없으면 if (i not in li2)
  25. 추출한 원소를 합집합 리스트에 추가한다. union.append(i)
  26. 반면에 추출한 원소가 두 번째 문자열의 다중집합 원소 리스트에 있으면 else
  27. 추출한 원소를 교집합 리스트에 추가하고 intersection.append(i)
  28. 두 번째 문자열의 다중집합 원소 리스트에서 추출한 문자를 제거해 다음 원소의 중복을 피한다. li2.remove(i)
  29. 만약 합집합과 교집합이 모두 공집합일 경우 if (len(union) == 0) and (len(intersection) == 0)
  30. 0으로 나눌 수 없으므로 유사도를 1로 한다. similarity = 1
  31. 두 집합이 모두 공집합이 아니라면 else
  32. 유사도는 교집합의 크기를 합집합의 크기로 나눈 값이다. similarity = len(intersection) / len(union)
  33. 유사도에 65536을 곱한 결과의 버림 한 값을 저장한다. answer = math.floor(similarity * 65536)
반응형

3. 소스코드

import math

def solution(str1, str2):
    answer = 0
    
    li1 = list()
    for i in range(1, len(str1)):
        word = str1[i - 1] + str1[i]
        if (word.isalpha()):
            li1.append(word.lower())
    
    li2 = list()
    for i in range(1, len(str2)):
        word = str2[i - 1] + str2[i]
        if (word.isalpha()):
            li2.append(word.lower())

    intersection = list()
    if (len(li1) >= len(li2)):
        union = list(i for i in li1)
        for i in li2:
            if (i not in li1):
                union.append(i)
            else:
                intersection.append(i)
                li1.remove(i)
    else:
        union = list(i for i in li2)
        for i in li1:
            if (i not in li2):
                union.append(i)
            else:
                intersection.append(i)
                li2.remove(i)

    if (len(union) == 0) and (len(intersection) == 0):
        similarity = 1
    else:
        similarity = len(intersection) / len(union)

    answer = math.floor(similarity * 65536)
    
    return answer
728x90
반응형