티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr

  • {'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]}
    • 이런 dictionary를 만드려고 꽤나 고생했다.
    • list에 tuple 원소를 추가할 때, 평소에 하듯이 dict.get(key, [])를 쓰려니까 [0, 500, 2, 150, ..] 이런 식으로 추가가 되었다.
    • 그래서 그냥 dict.keys()key가 있는 경우, 없는 경우를 분리해서 list.append((i, v))로 넣었다.
  • 정렬을 위해서 dict를 list 화 할 때 자꾸 dict.items() 함수의 존재를 까먹는다. 삽질하지 말고 이용하자. dict.items()도 정렬할 수 있다.
  • 런타임 에러가 나서 생각해보니, 같은 장르 내에서 두개 까지만 수록하는데, 한 장르에 한 장르만 있을 경우를 고려하지 않아서 당연히 에러가 났다. if 문으로 경우 분리하니 드디어 해결!
  • 처음 코딩테스트 공부 시작할 때는 못푼 문제였는데 풀어내서 기분 좋다 ㅎㅋ
def solution(genres, plays):
    answer = []
    gd = dict()
    pd = dict()

    for g, (i, p) in zip(genres, enumerate(plays)):
        gd[g] = gd.get(g, 0) + p
        if g in pd.keys():
            pd[g].append((i, p))
        else:
            pd[g] = [(i, p)]

    gl = sorted(gd.items(), key=lambda x: -x[1])
    #     {'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]} pd
    for g in gl:
        pl = pd[g[0]]
        pl.sort(key=lambda x: (-x[1], x[0]))
        if len(pl) >= 2:
            answer.append(pl[0][0])
            answer.append(pl[1][0])
        else:
            answer.append(pl[0][0])
    return answer

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함