파이썬으로 부시자! Python with Coreenee

프로그래머스 - 해쉬 - 베스트앨범

문제

스크린샷 2020-04-15 오후 4 40 56

입력

스크린샷 2020-04-15 오후 4 41 05


나의 처음 코드

문제에 들어가기 앞서, 문제를 쓰는데 사용한 zip이라는 내장함수에 대해서 알아보도록 하자.

zip(*args, **kwargs)

설명을 보면, 동일 개수로 이루어진 자료형을 묶어주는 역할을 한다. 그리고 tuple형식으로 내보낸다.
예를들어 [1,2,3], [4,5,6] 이라는 리스트가 있으면 [(1,4), (2,5), (3,6)]으로 묶어줄 수 있다는 뜻이다.


문제를 읽다보면, 해쉬가 필요함을 알 수 있다. 장르의 종류가 100개 미만이면, 최대 99개의 장르를 보관해야 할 수 있다는 소리다. 그럼 장르가 해쉬의 key가 된다고 생각하면 된다. 이 해쉬 문제들도 마찬가지로, 최대의 효율을 만들기 위해서 해쉬함수를 어떻게 짜야하는지 부터 시작이다. 당연히 장르가 key인것을 알 수 있고, key로 찾아가면 장르 안에 든 음악들이 들어있는 리스트가 있어야하는 것은 자명하다. 자료구조를 만들었으면, 문제에서 제시한 3가지의 우선순위에 맞춰서 알고리즘을 짜주면 된다.

def solution(genres, plays):
answer = []
genre_code = {}
play_code = []
gc_idx = 0
pl_idx = 0
for genre, play in zip(genres, plays):
    if genre not in genre_code:
        genre_code[genre] = gc_idx
        play_code.append({})
        play_code[gc_idx][pl_idx] = play
        gc_idx += 1
        pl_idx += 1
    else:
        tmp_idx = genre_code[genre]
        play_code[tmp_idx][pl_idx] = play
        pl_idx += 1

tmp = []
#sort 완료

for i in play_code:
        tmp.append(dict(sorted(i.items(), key = lambda x : (x[1], -x[0]))))

play_code = tmp.copy()

save_sum = [0] * len(play_code)

for i in range(len(play_code)):
    save_sum[i] = sum(play_code[i].values())

# 여기 까지가 총합 저장한 save_sum까지 저장완료

while True:
    max_num = max(save_sum)
    if max_num == -1:
        break
    max_idx = save_sum.index(max_num)
    num_pop = 0
    
    while True:
        if num_pop == 2 or len(play_code[max_idx]) == 0:
            break
        answer.append(play_code[max_idx].popitem()[0])
        num_pop += 1
    
    save_sum[max_idx] = -1
    
return answer

프로그래머스에서 다른 사람이 푼 풀이들 보면 매우 짧은 것들이 있다. lambda를 무척 잘 활용해야 함을. 느낄 수 있다…(난 못해,,,) 그리고 dictionary sort를 할때, 다음과 같이 해야한다.

sorted(i.items(), key = lambda x : (x[1], -x[0])). 

즉, 리스트와는 다르게 items()라는 것을 명시해줘야 한다. 다음과 같은 예시도 있다.
~~~python dicts = {1 : ‘a’, 2 : ‘b’}

#key값만 출력됨 for i in dicts: print(i)

#튜플 형식으로 키와 벨류 모두 출력됨 for i in dicts.items(): print(i) ~~~