본문 바로가기

B/Coding Test

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

문제를 풀지 못해서 앓다가 찾아본 풀이 . . . 1시간을 더 줘도 못풀었을것 같다.

가장 첫빠따로 있는 풀이를 공부해보았다.

1. 딕셔너리를 만드는 가장 기초적인 방법

 

d = {e:[] for e in set(genres)}

 

딕셔너리를 다음과 같이 만들 수 있었다.

set으로 장르를 묶었기 때문에 중복되는 원소가 없는 집합으로 for문이 돌아가면서 key값이 만들어질것이다.

그리고 value는 빈 리스트가 들어가겠고

2. sorted의 parameter인 key를 이용하자.

 

sorted(d, key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)

 

전형적으로 sorted는 알파벳순, 가나다순 정도로 생각했는데,

역시 내장된 파라미터를 통해서 어떻게 정렬할 것인가? 에 대한 방법도 세팅을 할 수 있었다.

특히 lambda 를 이용해서 함수로 적용하는것이 신기했다.

lambda를 두번 이용해서 좀 복잡해보이는데, 차근차근 보면 그리 어렵지는 않다.

lambda의 인자에 유의해서 어떻게 적용되는지를 위주로 해석하면 좋을 것 같다.

3. 작은 조건도 철저하게

 

min(len(temp),2)

 

min을 이용해서 만약 1글자가 나왔을때를 대비해주었다.

만약 내가 코딩했으면 if문으로 temp의 len이 1이 되는 경우를 따로 빼줬을텐데,

이런 방법이 더 효율적인 코드로 보인다

 

4/20 다시 문제를 풀고 난 풀이

def solution(genres, plays):
    answer = []
    
    temp = {}
    for i,j in zip(genres, plays):
        if i in temp.keys():
            temp[i] += j
        else:
            temp[i] = j
    
    li = [i[0] for i in sorted(temp.items(), key=lambda x: x[1], reverse=True)]
    k = [(i,j) for i,j in zip(genres,plays)]
    
    for gen in li:
        cand = []
        for num, dic in enumerate(k):
            if dic[0] == gen:
                cand.append((num, dic[1]))
            
        cand = sorted(cand, key=lambda x: -x[1])
        if len(cand)==1:
            answer.append(cand[0][0])
        else:
            answer.append(cand[0][0])
            answer.append(cand[1][0])
                
        
    return answer