데이터사이언스 기록기📚

[프로그래머스/Python] Level 2_[1차] 뉴스 클러스터링(2018 KAKAO BLIND RECRUITMENT) 본문

Coding Test/프로그래머스(Python)

[프로그래머스/Python] Level 2_[1차] 뉴스 클러스터링(2018 KAKAO BLIND RECRUITMENT)

syunze 2022. 10. 28. 18:48

📌문제 유형

2018 KAKAO BLIND RECRUITMENT

 

📌문제

 

프로그래머스

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

programmers.co.kr

 

📌나의 문제풀이

- 문제풀이 순서

  • 대소문자 구분X : 문자로 모두 변경
  • 두 글자씩 끊어서 작성: 특수문자 아닐 경우, 리스트에 넣기 (리스트 컨프리헨션에 for-if문 사용)
    [최종 결과물 for문 - if문] 
  • 예외 처리: 나눗셈 정의 안되는 경우 1로 정의
  • 자카드 유사도 계산
    - 다중 집합의 합집합 : 하나의 리스트 복사 후, 다른 리스트랑 비교하기
    - 다중 집합의 교집합 : 리스트 1,2 비교하면서 동시에 있으면 다른 리스트에 넣기
 

[개념정리] 파이썬 다중 집합의 교집합, 합집합

코테 연습할때마다 잊을만 하면 나오는 다중집합이다. 굳이 몰라도 되지만, 모른채 쓰려면 머지소트를 구현해야 하는 굉장한 번거로움이 있기때문에 알아두는게 좋을 것 같아서 포스팅 한다. 1.

velog.io

def solution(str1, str2):
    answer = 0
    
    # 대소문자 구분X
    str1 = list(str1.lower())
    str2 = list(str2.lower())
    
    # 두 글자씩 끊어서 작성
    str1_list = [str1[i] + str1[i+1] for i in range(len(str1)-1) if (str1[i] + str1[i+1]).isalpha() == True]
    str2_list = [str2[i] + str2[i+1] for i in range(len(str2)-1) if (str2[i] + str2[i+1]).isalpha() == True]
    
    # 나눗셈 정의 안되는 경우 1로 정의
    if len(str1_list) == 0 and len(str2_list) == 0:
        return round(1 * 65536,1)
    
    # 자카드 유사도 계산
    overlap = []
    a_temp = str1_list.copy()
    result = str1_list.copy()
    
    # 분모 구하기
    for i in str2_list:
        if i not in a_temp:
            result.append(i)
        else:
            a_temp.remove(i)
    
    # 분자 구하기
    for i in str2_list:
        if i in str1_list:
            str1_list.remove(i)
            overlap.append(i)
            

    return int((len(overlap) / len(result))* 65536)

 

📌다른 사람의 문제풀이

1) min,max 이용한 다중집합 처리

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)

 

📌리뷰

- 다중 교집합/합집합 : set으로 중복안된 집합 만들기 -> min, max로 계산하기

 

📌참고

 

[파이썬 중급 문법] 리스트 컴프리헨션 간단 정리

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록

coding-kindergarten.tistory.com

 

 

Python 리스트 합집합, 교집합, 차집합, 대칭차 - 제타위키

다음 문자열 포함...

zetawiki.com

 

 

[개념정리] 파이썬 다중 집합의 교집합, 합집합

코테 연습할때마다 잊을만 하면 나오는 다중집합이다. 굳이 몰라도 되지만, 모른채 쓰려면 머지소트를 구현해야 하는 굉장한 번거로움이 있기때문에 알아두는게 좋을 것 같아서 포스팅 한다. 1.

velog.io

 

728x90
Comments