코딩테스트/프로그래머스

[프로그래머스] [Level 3] [해시] 베스트 앨범

박소민 2022. 10. 6. 22:00
베스트 앨범
 

프로그래머스

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

programmers.co.kr

 

  • 첫 번째 풀이 : fail
dn=sorted(dic.items(), key= lambda x:[sum(x[1])], reverse=True)

- lambda 식에 sum(x[1]) 만 넣으면 에러

→ 리스트 안에 넣어줘야 함

def solution(genres, plays):
    dic={}
    answer = []
    
    for idx, genre in enumerate(genres):
        if genre not in dic.keys():
            dic[genre]=[] #여러 값 담기위해 리스트로 초기화
        dic[genre].append(plays[idx])
    
    #람다식에서 sum을 리스트 안에 넣으니까 됨
    dn=sorted(dic.items(), key= lambda x:[sum(x[1])], reverse=True) 
    
    for d in dn:
        d[1].sort(reverse=True)
        for i in range(2):
            answer.append(plays.index(d[1][i]))
        
    return answer

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 두 번째 풀이 : 성공 !
    • 📍 마지막 2중 for문에서 d[1]의 값이 2개 미만일 수 있다는 점 간과 → 런타임 에러의 원인
      • → len(d[1])의 길이로 for문 돌림
    • 📍재생횟수가 같은 노래의 경우 고유번호 낮은 노래 먼저 수록
      • → 같은 인덱스를 2번 넣지 않도록 확인한 인덱스의 값을 0으로 변경
def solution(genres, plays):
    dic={}
    answer = []
    
    for idx, genre in enumerate(genres):
        if genre not in dic.keys():
            dic[genre]=[] #여러 값 담기위해 리스트로 초기화
        dic[genre].append(plays[idx])
    
    #람다식에서 sum을 리스트 안에 넣으니까 됨
    dn=sorted(dic.items(), key= lambda x:[sum(x[1])], reverse=True) 
    
    for d in dn:
        d[1].sort(reverse=True)
        for i in range(len(d[1])):
            answer.append(plays.index(d[1][i]))
            plays[plays.index(d[1][i])]=0 #인덱스를 2번 세지 못하도록 변경
            if i==1:
                break
    
    return answer

 


  • 다른 사람 풀이
    • key= lambda x: (x[0], -x[1])를 한 이유
      • 튜플 형태일때 첫번째 요소를 기준으로 정렬하고 첫번째 요소가 같은 경우 두번째 요소를 기준으로 정렬하는 원리를 이용
      • -를 붙인것은 고유번호가 낮은 것을 크다고 보는 것
    • min(len(temp),2)
      • 재생횟수가 2번 미만일 경우 고려하여 len(temp)와 2중 작은 값을 택하도록 함
    • sum( map ( lambda y: y[0], d[x]))
      • y=d[x] 로 이용해서 불러오는 것과 같이 값 안에있는 값을 다시 불러올 때 사용
def solution(genres, plays):
    answer = []
    d = {e:[] for e in set(genres)}
    for e in zip(genres, plays, range(len(plays))):
        d[e[0]].append([e[1] , e[2]])
    genreSort =sorted(list(d.keys()), key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)
    for g in genreSort:
        temp = [e[1] for e in sorted(d[g],key= lambda x: (x[0], -x[1]), reverse = True)]
        answer += temp[:min(len(temp),2)]
    return answer