[프로그래머스/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
전체
오늘
어제
  • 분류 전체보기 (81) N
    • Error Handling (7)
    • Project (5)
      • MEV (2) N
    • Computer Science (4)
      • Data Structure (2)
      • Database (1)
      • Cloud (0)
      • OS (0)
      • Infra, Network (1)
      • AI (0)
    • Language (4)
      • Go (3)
      • Rust (1)
      • Python (0)
      • Java (0)
    • Algorithm (39)
      • BaekJoon (18)
      • Programmers (7)
      • LeetCode (6)
      • NeetCode (8)
    • SW Books (9)
      • gRPC Up & Running (1)
      • System Design Interview (2)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (6)
      • 블록체인 해설서 (0)
      • 후니의 쉽게 쓴 CISCO 네트워킹 (0)
    • Own (3)
      • Personal (1)
      • Novel (0)
      • Memo (2)
    • BlockChain (4)
      • Issues (0)
      • Research (4)
      • Tech (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • candlechart
  • MongoDB
  • 2024
  • decimal
  • 백준
  • Programmers
  • 큐
  • golang
  • MEV
  • LeetCode
  • ethereum
  • NeetCode
  • Greedy
  • go
  • EVM
  • BFS
  • blockchain
  • 프로그래머스
  • Palindrome
  • two pointer
  • 스택
  • BEAKJOON
  • 해시
  • 블록체인
  • Hash Table
  • BaekJoon
  • Python
  • KBW
  • DP
  • 그리디

최근 댓글

최근 글

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

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.