관리 메뉴

Mini

프로그래머스 뉴스클러스터링 파이썬 // 해시맵(dict), 중복집합원소세기 본문

Algorithm/programmers

프로그래머스 뉴스클러스터링 파이썬 // 해시맵(dict), 중복집합원소세기

Mini_96 2023. 7. 12. 14:36

코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

*의사코드

1. 소문자로

2. 2칸씩검사하면서

알파벳이아니면 컨틴뉴

아니면 append

3. dict에 key,원소갯수 저장

※ m['a'] 바로접근시 에러

해결 : if 문자 not in m -> 할당 m[문자]=1

else: m[문자]+=1

4. 맵순회하면서 ( for key in m)

ex) s1 : 'fr' : 3

s2 : 'fr',5

이면

합집합==최대값

교집합==최소값이됨

4.1 중복키가 존재하는경우 -> 최대값,최소값

아닌경우로 분할 -> 합집합+ 원소갯수, 교집합은 pass

def solution(str1, str2):
    answer = 0
    
    s1=[]
    s2=[]
    #s1.add(1)
    ##############################
    #all 소문자로
    str1=str1.lower()
    #print(str1)
    str2=str2.lower()
    ##############################
    
        
    #두문자씩 끊기
    #특수문자가잇는경우 continue
    for i in range(len(str1)-1):
        #print(0+i," ",2+i)
        if not str1[0+i:2+i].isalpha():
            continue
        s1.append(str1[0+i:2+i])
        #s1.add(str1[0+i:2+i])
    for i in range(len(str2)-1):
        if not str2[0+i:2+i].isalpha():
            continue
        #print(0+i," ",2+i)
        #s2.add(str2[0+i:2+i])
        s2.append(str2[0+i:2+i])
    
    ##################################
    #합집합의 원소갯수구하기
    #s1의 1의갯수 : 3개
    #s2의 1의갯수 : 5개 -> 합집합의 1의갯수는5개]
    #{'fr': 1, 'ra': 1, 'an': 1, 'nc': 1, 'ce': 1} 이런식으로저장하기
    합집합원소수=0
    맵1=dict()
    맵2=dict()
    for s in s1:
        if s not in 맵1:
            맵1[s]=1
        else:
            맵1[s]+=1
    for s in s2:
        if s not in 맵2:
            맵2[s]=1
        else:
            맵2[s]+=1
    print(맵1, 맵2)
    
    #합집합수구하기
    for key in 맵1:
        #맵2에도 존재하는경우
        if key in 맵2:
            합집합원소수+=max(맵2[key],맵1[key])
        else:
            합집합원소수+=맵1[key]
    for key in 맵2:
        #맵2에도 존재하는경우
        if key in 맵1:
            pass #위랑중복
        else:
            합집합원소수+=맵2[key]
    print(합집합원소수)
            
    #교집합수구하기
    교집합원소수=0
    for key in 맵1:
        #맵2에도 존재하는경우
        if key in 맵2:
            교집합원소수+=min(맵2[key],맵1[key])
        else:
            pass
    for key in 맵2:
        #맵1에도 존재하는경우
        if key in 맵1:
            pass
        else:
            pass
    print(교집합원소수)
    
    
    #s1=set([1,2,3,1])
    print(s1)
    print(s2)
    
    #모두공집한인경우
    if(len(s1)==0 and len(s2)==0):
        return 65536
    answer=교집합원소수/합집합원소수 * 65536
    answer=int(answer)
    return answer