베스트앨범

bird.j·2021년 6월 28일
0

프로그래머스

목록 보기
20/53

프로그래머스

from collections import defaultdict

def solution(genres, plays):
    answer = []
    
    music = defaultdict(lambda : [])
    for i, gp in enumerate(zip(genres, plays)):
        music[gp[0]].append((gp[1], i))
    music = sorted(music.items(), key=lambda x: x[0], reverse=True)

    for i in range(len(music)):
        music[i][1].sort(key=lambda x : (-x[0], x[1]))
        answer.append(music[i][1][0][1])
        if len(music[i][1]) > 1:
            answer.append(music[i][1][1][1])

    return answer

처음에 이렇게 했더니 15개 중에 3개만 통과했다..
문제는 합이 큰 장르별로 정렬이 안되었던 것이다.

따라서 장르와 합을 매핑하여 합 내림차순으로 정렬한 genre_list를 만들어준다.

그리고 장르 / 재생 수, 아이디를 매핑한 music리스트를 만들어준다.
이 때 인덱스와 두가지 리스트 값 총 세가지를 고려하고 싶을 때
for index, value in enumerate(리스트)처럼 똑같이 가되, enumerate안에 리스트를 zip()으로 엮으면 된다.
그러면 value[0]이 zip의 첫번째 원소의 리스트의 값, value[1]이 zip의 두번째 원소의 리스트의 값이 된다.

이제 genre_list에 있는 genre를 하나씩 꺼내어 (이미 재생수로 장르 별 내림차순) music리스트에 해당하는 장르의 (재생수, 인덱스)를 내림차순 정렬해주고 첫번째 원소의 인덱스를 리턴할 리스트에 추가한다.
그리고 만약 그 장르의 리스트에 원소가 2개 이상이면 두번째 것도 추가한다.

from collections import defaultdict

def solution(genres, plays):
    answer = []
    
    # 장르 순서
    genre_list = defaultdict(lambda : 0)
    for genre, play in zip(genres, plays):
        genre_list[genre] += play
    # 장르 별 가장 많이 재생된 순서대로
    genre_list = sorted(genre_list.items(), key=lambda x : x[1], reverse=True)
    
    # 장르와 plays 그리고 인덱스로 해쉬맵 만들기
    music = defaultdict(lambda : [])
    # gp[0]는 genre, gp[1]은 play
    for i, gp in enumerate(zip(genres, plays)):
        music[gp[0]].append((gp[1], i))

    for genre in genre_list:
        music[genre[0]] = sorted(music[genre[0]], key=lambda x : (-x[0], x[1]))
        answer.append(music[genre[0]][0][1])
        if len(music[genre[0]]) > 1:
            answer.append(music[genre[0]][1][1])
            
    return answer
  • defaultdict()는 딕셔너리를 만드는 dict클래스의 서브클래스이다.
    인자로 객체의 기본값을 딕셔너리의 초깃값으로 지정할 수 있다.
    모든 키에 대해서 값이 없는 경우 자동으로 생성자의 인자로 넘어온 함수를 호출하여 그 결과값으로 설정해준다.

  • 정렬 시 딕셔너리의 값(value)으로 정렬하려면 리스트.items()로 하면 된다.

  • 두가지 조건 적용하여 정렬하고 싶을 때
    만약 첫번째 원소 내림차순, 두번째 원소 오름차순이라면
    sorted(list, key=lambda x : (-x[0], x[1]))
    이렇게 내림차순은 '-'를 붙여주면 된다.

  • enumerate(zip(리스트1, 리스트2)) 이런 식으로 리스트 여러개와 인덱스를 한번에 생각할 수 있다.

0개의 댓글