sugenius

[프로그래머스/코딩테스트 고득점 Kit/Python] 해시 본문

PROGRAMMERS/Coding Test, Python

[프로그래머스/코딩테스트 고득점 Kit/Python] 해시

sugeniusk 2023. 12. 6. 21:34

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


<해시> 
Q.완주하지 못한 선수 #***

def solution(participant, completion):
    answer = ''
    '''
    #틀림. 효율성 테스트 모두 실패 
    for c in completion : 
        participant.remove(c)
    answer=participant[0]
    '''
    tmp=dict() 
    for p in participant : 
        tmp[p]=tmp.get(p,0) +1
    for c in completion :
        tmp[c]=tmp[c]-1
    
    for t in tmp.keys() :
        if tmp[t] > 0 :
            answer=t
            break
    
    return answer

'''
import collections
def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
'''
'''
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]
'''


Q.폰켓몬

def solution(nums):
    answer = 0
    cnt=len(nums)
    nums=set(nums)
    if len(nums) > cnt/2 :
        answer = cnt/2 
    else : 
        answer=len(nums)
    return answer
    #return min(len(ls)/2, len(set(ls)))


Q.전화번호 목록 #***

def solution(phone_book):
    '''
    #틀림 ㅠ 
    answer = True
    x = min(phone_book) 
    for p in phone_book : 
        if x in p and p!=x: 
            answer=False
            break
    '''
    answer=True
    phone_book = sorted(phone_book)
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1): 
            answer=False
            break
    return answer


Q.의상 #*** 

'''
A 종류 N개,B 종류 M개 일 때 가능한 모든 경우의 수는 (N+1)(M+1)
(N+1)(M+1) = NM + N + M + 1
NM: N과 M을 모두 사용하는 경우
N: N만 사용하는 경우
M: M만 사용하는 경우
1: 모두 사용하지 않는 경우 
따라서, 결괏값 리턴시 -1을 통해 아무것도 입지 않는 경우를 제외하여 
최소 1개 이상의 의상을 입는 경우의 수만 리턴할 수 있도록 함 
(출처 구글링)
'''
def solution(clothes):
    answer = 0
    tmp=dict() 
    for c in clothes : 
        type=c[1]
        tmp[type] = tmp.get(type,0) + 1 
        
    answer=1
    for type,cnt in tmp.items() : 
        answer*=(cnt+1)
    answer-=1
    
    return answer


Q.베스트 앨범 #*** 

def solution(genres, plays):
    answer = []
    dic1={}
    dic2={}
    for i , (g,p) in enumerate(zip(genres, plays)) : #dic1 : 장르 인덱스 , 값 정리 (리스트로 저장)
        #print(i,g,p)
        if g not in dic1 : 
            dic1[g] = [(i,p)]
        else :
            dic1[g].append((i,p))
        #print(dic1) #{'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]}
        
        if g not in dic2 : #dic2 : 장르별 합계
            dic2[g] = p 
        else : 
            dic2[g] += p 
        #print(dic2) #{'classic': 1450, 'pop': 3100} 
        
    for (k,v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True) : #같은 장르 내에서는 최대 2곡까지 
        for (i,p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]: 
            answer.append(i)
    return answer