자료구조 알고리즘/코딩테스트

프로그래머스 베스트앨범

내공얌냠 2025. 2. 16. 09:35

정말 정말 풀기 싫은 레벨3 를 풀었습니다

레벨 2를 다 풀고 하면 되지 않나, 문제도 길고 조건이 많잖아ㅠ

<<  어차피 코테 쉬운 문제도 섞여 나오면 그거라도 제대로 풀자 (난 잘 못 풀지만)

이 마인드로 하다가 고득점 kit 에 더이상 풀 레벨2 가 없어서 눈물을 머금고 도전,,,

이것저것 해보다가 한시간 좀 넘게 걸렸는데 << 뭐 어쩔건데 풀었잖아~

할만한데 뭔가 다른 사람 풀이 보니까 다들 잘혀~,,,,,

좀 fansy 하게 풀지를 못했고,, 코드 좀 길긴해..

그래도 중간중간 chatgpt 키고 싶은 마음 꾹 참으면서 일요일 아침을 잘 보냈네요..

https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

배운 것

그냥 compare(a, b) 만들어서 쓰는 줄 알았는데 cmp_to_key 로 함수명을 넘겨주면 되는 거였고~

-1, 0, 1 숫자 작게 반환할수록 앞쪽에 위치하게 됨.

from collections import Counter
from functools import cmp_to_key

def solution(genres, plays):
    answer = []
    idx_gen_play = []
    genre_dict = {}
    # 가장 많이 재생된 장르 확인
    for idx, (genre, play) in enumerate(zip(genres, plays)):
        idx_gen_play.append((idx, genre, play))
        if genre not in genre_dict:
            genre_dict[genre] = play
        else:
            genre_dict[genre] += play
    genre_dict = sorted(genre_dict, key=lambda x: genre_dict[x], reverse=True)

    # idx_gen_play 를 위에서 구한 genre_dict 순서대로 sort 시키기
    def sort_genre(a, b):
        a_idx = genre_dict.index(a[1])
        b_idx = genre_dict.index(b[1])
        if a_idx < b_idx:
            return -1
        elif a_idx > b_idx:
            return 1
        else:
            return 0

    # 장르 내에서 많이 재생된 노래 확인
    def max_play(a, b):

        if a[2] > b[2]:
            return -1
        elif a[2] < b[2]:
            return 1
        else:
            # 장르 내에서 재생 횟수가 같은 노래에서 고유번호가 낮은 노래 먼저 넣기
            if a[0] < b[0]:
                return -1
            elif a[0] > b[0]:
                return 1
            else:
                return 0

    idx_gen_play = sorted(idx_gen_play, key=cmp_to_key(max_play))
    idx_gen_play = sorted(idx_gen_play, key=cmp_to_key(sort_genre))

    # 장르별로 2개씩 가져오기
    cur_idx = 0
    for cur_genre in genre_dict:
        # pop
        genre_cnt = 0
        # print(cur_genre, genre_cnt)
        for (idx, genre, play) in idx_gen_play[cur_idx:]:
            # print(cur_genre, idx, genre, play)
            if cur_genre == genre:
                if genre_cnt < 2:
                    answer.append(idx)
                genre_cnt += 1
                cur_idx += 1
            if genre_cnt >= 2:
                break

    return answer
728x90
반응형