[프로그래머스/Python] 베스트앨범

2023. 9. 13. 00:22·Algorithm/Programmers

dictionary 하나로 풀어보려고 했는데 도저히 각이 안나와서 그냥 dictionary 2개를 썼다

그래서 풀이가 좀 더럽긴하지만,, 일단 맞았으니 올려본다

def solution(genres, plays):
    album_by_genre = {} # genre, (play, index)
    plays_by_genre = {} # (genre, plays)
    for i, play in enumerate(plays):
        g = genres[i]
        if g in plays_by_genre:
            plays_by_genre[g] += play
            album_by_genre[g].append((play, i))
        else:
            plays_by_genre[g] = play
            album_by_genre[g] = [(play, i)]
    for k, v in album_by_genre.items():
        album_by_genre[k] = sorted(v, key=lambda x: x[0], reverse=True)
    
    gp = sorted(plays_by_genre.items(), key = lambda x: x[1], reverse= True)

    answer = []
    for genre, _ in sorted(plays_by_genre.items(), key = lambda x: x[1], reverse= True):
        t = 0
        for play, index in album_by_genre[genre]:
            if t < 2:
                t += 1
                answer.append(index)
    
    return answer

0. 장르별 재생된 횟수 총합을 저장하는 딕셔너리, 장르별 (횟수, 인덱스) 쌍을 저장하는 딕셔너리를 만들었다.

1. 첫 for문을 돌면서 장르별 재생 횟수 총합을 계산하고, album_by_genre 딕셔너리에 데이터를 집어넣는다.

2. album_by_genre 를 각각 재생 횟수별로 정렬해주기 위해 for문을 다시 돈다.

3. plays_by_genre도 재생 횟수 총합을 기준으로 내림차순으로 정렬해준다.

4. for문을 돌면서 재생횟수 총합이 많은 장르 순대로, 노래별 재생 횟수가 많은 고유번호를 최대 2개까지 넣어준다.

 

 

시간 복잡도

정렬: O(nlogn)

for문: O(n)

=> O(n²logn)

별로인 풀이...ㅎ..

 

다른 사람 풀이

- 이중 람다

def solution(genres, plays):
    answer = []
    d = {e:[] for e in set(genres)}
    for e in zip(genres, plays, range(len(plays))):
        d[e[0]].append([e[1] , e[2]])
    genreSort =sorted(list(d.keys()), key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)
    for g in genreSort:
        temp = [e[1] for e in sorted(d[g],key= lambda x: (x[0], -x[1]), reverse = True)]
        answer += temp[:min(len(temp),2)]
    return answer

처음에 내가 풀고 싶었던 풀이를 그대로 옮겨놓았다.

(play, index)만 저장하고, sum을 이용해 sort하고 싶었다. 근데 방법을 몰라서 결국 sum을 하는 dictionary를 별도로 만든거였는데

이중 람다가 방법이었다!!!

genreSort -> 재생횟수 총합으로 장르 기준 정렬

  • x: 장르
  • d[x]: 해당 장르의 (play, index) 배열
  • y: d[x] 배열의 원소. 즉, (play, index)
  • y[0]는 play

for genreSort -> 재생횟수 많고 횟수가 같다면 고유 번호가 낮은 노래 골라서 수록

min(len(temp),2) -> 와우... 최대 2개, 적다면 그 길이대로

 

- class 활용

def solution(genres, plays):
    answer = []
    dic = {}
    album_list = []
    for i in range(len(genres)):
        dic[genres[i]] = dic.get(genres[i], 0) + plays[i]
        album_list.append(album(genres[i], plays[i], i))

    dic = sorted(dic.items(), key=lambda dic:dic[1], reverse=True)
    album_list = sorted(album_list, reverse=True)



    while len(dic) > 0:
        play_genre = dic.pop(0)
        print(play_genre)
        cnt = 0;
        for ab in album_list:
            if play_genre[0] == ab.genre:
                answer.append(ab.track)
                cnt += 1
            if cnt == 2:
                break

    return answer

class album:
    def __init__(self, genre, play, track):
        self.genre = genre
        self.play = play
        self.track = track

    def __lt__(self, other):
        return self.play < other.play
    def __le__(self, other):
        return self.play <= other.play
    def __gt__(self, other):
        return self.play > other.play
    def __ge__(self, other):
        return self.play >= other.play
    def __eq__(self, other):
        return self.play == other.play
    def __ne__(self, other):
        return self.play != other.play

pytonic 그 자체..

class 끼리 비교하는 기준을 세움

 

'Algorithm > Programmers' 카테고리의 다른 글

[프로그래머스/Python] 구명보트  (0) 2023.09.21
[프로그래머스/Python] 의상  (0) 2023.09.12
[프로그래머스/Python] 전화번호 목록  (0) 2023.09.12
[프로그래머스/Python] 뒤에 있는 큰 수 찾기  (0) 2023.09.05
[프로그래머스/Python] 스택/큐  (0) 2023.09.05
'Algorithm/Programmers' 카테고리의 다른 글
  • [프로그래머스/Python] 구명보트
  • [프로그래머스/Python] 의상
  • [프로그래머스/Python] 전화번호 목록
  • [프로그래머스/Python] 뒤에 있는 큰 수 찾기
빵빵0
빵빵0
(아직은) 공부하고 정리하는 블로그입니다.
  • 빵빵0
    Hack Your World
    빵빵0
  • 전체
    오늘
    어제
    • 분류 전체보기 (93)
      • Error Handling (7)
      • Project (5)
        • MEV (2)
      • Architecture (0)
        • API (0)
        • Cache (0)
        • 사소한 고민거리 (0)
      • Computer Science (4)
        • Data Structure (2)
        • Database (1)
        • Cloud (0)
        • OS (0)
        • Infra, Network (1)
        • AI (0)
      • Language (9)
        • Go (9)
        • Rust (0)
        • Python (0)
        • Java (0)
      • Algorithm (40)
        • BaekJoon (18)
        • Programmers (7)
        • LeetCode (6)
        • NeetCode (9)
      • SW Books (9)
        • gRPC Up & Running (1)
        • System Design Interview (2)
        • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (6)
        • 블록체인 해설서 (0)
        • 후니의 쉽게 쓴 CISCO 네트워킹 (0)
      • BlockChain (4)
        • Issues (0)
        • Research (4)
        • Tech (0)
      • Own (8)
        • TIR(Today I Read) (3)
        • Personal (2)
        • Novel (0)
        • Memo (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    candlechart
    NeetCode
    BEAKJOON
    블록체인
    MEV
    큐
    Palindrome
    Python
    LeetCode
    KBW
    chart
    백준
    Programmers
    BFS
    blockchain
    go
    BaekJoon
    프로그래머스
    MongoDB
    golang
    goroutine
    스택
    EVM
    ethereum
    DP
    two pointer
    context
    Hash Table
    2024
    Greedy
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
빵빵0
[프로그래머스/Python] 베스트앨범
상단으로

티스토리툴바