본문 바로가기

코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.3 베스트 엘범

 

문제 분석

  • 장르별로 가장 많이 재생된 노래를 2개씩 모아 (최대 2개) 베스트 엘범을 출시하려 함
  • 노래는 고유 번호로 구분
  • 노래를 수록 하는 기준
    • 1. 속한 노래가 많이 재생된 장르 먼저 수록
    • 2. 장르 내 많이 재생된 노래 먼저 수록
    • 3. 장르 내 재생 횟수가 같은 노래 중 고유 번호가 낮은 노래 먼저 수록
  • genres : 노래 장르 문자열
  • plays : 노래 별 재생 횟수
  • 베스트 엘범에 들어갈 노래의 고유 번호를 순서대로 return

 

코드 설계

  1. 장르 선택 : 장르들의 재생횟수 합
  2. 같은 장르의 노래 재생수 확인
  3. 많이 들은 것 중 최대 2개 선택
  • 장르 : key, 재생 횟수 : value인 dictionary

 

1차

def solution(genres, plays):
    answer = []
    set_genres = set(genres)
    print(set_genres)
    best = {}

    for i in range(len(genres)):
        if genres[i] in best.keys():
            best[genres[i]] += int(plays[i])
        else :
            best[genres[i]] = int(plays[i])

    print(best)
    print(best.values())
    print(max(best.values())) # 딕셔너리 value 중 최댓값
    print([k for k,v in best.items() if v == max(best.values())]) # value가 최댓값인 key

    
    return answer

g = ["classic", "pop", "classic", "classic", "pop"]
p = [500, 600, 150, 800, 2500]

print(solution(g,p))
  • 현재 최대 플레이수를 갖는 장르를 찾음
  • 해당 장르를 갖는 것만 빼서 새로운 list로 저장
  • 아 근데 처음 리스트의 인덱스 값도 가지고 있어야..
  • 해당 장르의 베스트를 뽑고 나면 set_genre에서 제거

 

def solution(genres, plays):
    answer = []
    set_genres = set(genres)
    best = {}

    for i in range(len(genres)):
        if genres[i] in best.keys():
            best[genres[i]] += int(plays[i])
        else :
            best[genres[i]] = int(plays[i])

    print(best)
    print(best.values())
    print(max(best.values())) # 딕셔너리 value 중 최댓값
    print([k for k,v in best.items() if v == max(best.values())]) # value가 최댓값인 key

    gg = [k for k,v in best.items() if v == max(best.values())]
    same_genre = []
    for k, v in best.items() :
        if k == gg :

    return answer

실패

 

정답 코드

다른 사람 코드 1

https://velog.io/@sem/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LEVEL3-%EB%B2%A0%EC%8A%A4%ED%8A%B8%EC%95%A8%EB%B2%94-Python

def solution(genres, plays):
    answer = []
    temp = []
    total_genre = {}

    temp = [[genres[i], plays[i], i] for i in range(len(genres))] # [장르, 재생횟수, 고유 번호] 리스트
    temp = sorted(temp, key=lambda x : (x[0], -x[1], x[2])) # 많이 재생될수록, 같다면 고유번호가 낮을수록

    for g in temp : # {장르 : 총 재생횟수} 장르별 재생 횟수 딕셔너리 생성
        if g[0] not in total_genre :
            total_genre[g[0]] = g[1]
        else :
            total_genre[g[0]] += g[1]

    total_genre = sorted(total_genre.items(), key=lambda x : -x[1]) # 재생횟수가 많은 순서대로 / 내림차순

    for i in total_genre : # 같은 장르에서 최대 2곡까지 수록
        count = 0
        for j in temp :
            if i[0] == j[0] : # 같은 장르이면
                count += 1
                if count > 2 :
                    break
                else :
                    answer.append(j[2]) # 고유번호 입력

    return answer
  • [장르, 재생횟수, 인덱스(고유번호)] 형식으로 리스트 저장
  • 속한노래가 가장 많이 재생된 장르를 먼저 수록하기 위해 장르를 key로 하는 딕셔너리 생성
  • 재생횟수 내림차순, 고유번호 오름차순 정렬
  • 최종 생성한 딕셔너리 key 순서대로 정렬한 리스트를 탐색하며 최대 count 2까지의 고유번호를 수록

 

다른 사람 풀이 2

def solution(genres, plays):
    answer = []

    dic1 = {}
    dic2 = {}

    for i, (g, p) in enumerate(zip(genres, plays)):
        if g not in dic1:
            dic1[g] = [(i, p)]
        else:
            dic1[g].append((i, p))

        if g not in dic2:
            dic2[g] = p
        else:
            dic2[g] += p

    for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
        for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
            answer.append(i)

    return answer

 

2회차 - 2024.11.28