이 포스팅은 프로그래머스 시리즈 28 편 중 10 번째 글 입니다.

  • Part 1 - 01: 다리를 지나는 트럭
  • Part 2 - 02: 멀정한 사각형
  • Part 3 - 03: 더 맵게
  • Part 4 - 04: 메뉴 리뉴얼
  • Part 5 - 05: 전화번호 목록
  • Part 6 - 06: 가장 큰 수
  • Part 7 - 07: 예상 대진표
  • Part 8 - 08: 다단계 칫솔 판매
  • Part 9 - 09: 불량 사용자
  • Part 10 - This Post
  • Part 11 - 11: 합승 택시 요금
  • Part 12 - 12: 스타 수열
  • Part 13 - 13: 위장
  • Part 14 - 14: 주식 가격
  • Part 15 - 15: 디스크 컨트롤러
  • Part 16 - 16: N으로 표현
  • Part 17 - 17: 전화번호 목록
  • Part 18 - 18: 단어 변환
  • Part 19 - 19: 여행 경로
  • Part 20 - 20: 프린터
  • Part 21 - 21: 후보키
  • Part 22 - 22: 삼각 달팽이
  • Part 23 - 23: 실패율
  • Part 24 - 24: 입국심사
  • Part 25 - 26: 기둥과 보 설치
  • Part 26 - 27: 광고 삽입
  • Part 27 - 28: 퍼즐 조각 채우기
  • Part 28 - 29: 상호 평가
▼ 목록 보기

목차

▼ 내리기

풀이

아니, 갑자기 딕셔너리 소트 안되는게 말이냐구.. 왜 다 풀줄 아는데 꼭 저런거 때매 문제일까. 더 많이 풀어서 오류를 판단하는 눈을 길러야 한다.

Code

def solution(genres, plays):
    # 속한 노래가 많이 재생된 장르를 먼저 수록..
    # 그니까 장르중에 많이 재생된 장르부터 선택
    # 그리고 장르별로 2곡씩 모을 것. 근데 장르 수록곡이 한개면 하나만 넣는다.
    # 만약에 재생 횟수가 같으면 고유번호가 낮은 것부터 넣는다.
    
    # 장르 : [재생 횟수대로 정렬, 그다음 id로 정렬]
    # 장르 돌면서 0, 1 뽑는다. 근데 이때 장르안에 들어간 개수가 1이하인 경우 하나만 넣는다.
    
    play_dict = dict()
    genre_dict = dict()
    for i, (g, p) in enumerate(zip(genres, plays)):
        
        if g not in genre_dict:
            genre_dict[g] = 0
        genre_dict[g] += p
        
        if g not in play_dict:
            play_dict[g] = []
        play_dict[g].append((p, i))
        
    order = dict(sorted(genre_dict.items(), key=lambda x: x[1], reverse=True)).keys()
    
    for a in play_dict:
        play_dict[a] = sorted(play_dict[a], key=lambda x: (-x[0], x[1]))
    
    answer = []
    for o in order:
        answer.append(play_dict[o][0][1])
        if len(play_dict[o]) >= 2:
            answer.append(play_dict[o][1][1])
            
    return answer