프로그래밍공부/알고리즘

코딩테스트 - 알고리즘 공부 - 베스트앨범

중랑구보안관 2020. 7. 28. 10:40

프로그래머스의 문제 중 하나인 베스트앨범을 풀어보았다.

자료를 잘 정렬하는것이 관건인 문제였다.

 

문제는 아래와 같다!

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

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr

 

문제의 정답의 조건은 

1. 가장 많이 재생된 장르를 찾아내고

2. 장르중 많이 재생된 노래를 찾아내고

3. 그중에 재생횟수가 같다면 고유번호가 낮은 노래를 수록해야 했다.

 

다행이 python에는 sorted라는 메소드가 있고 람다식으로 여러조건을 걸어 정렬할 수가 있어서 풀 수 있었다.

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

    length = len(genres)
    #장르별 총 재생횟수 구하기
    totalPlays = {}
    #장르별 내림차순 구하기
    totalList=[]
    for index in range(length):
        gene = genres[index]
        play = plays[index]
        if gene in totalPlays:
            totalPlays[gene]+=play
        else:
            totalPlays[gene]=play
        totalList.append([genres[index], plays[index], index])  
            
    sortedTotalList = sorted(totalList, key=lambda x: (x[0], -x[1]) )
    sortedTotalPlays = sorted(totalPlays.items(), reverse=True, key=lambda item: item[1])

    #2개씩 뽑기위한 변수
    count = 0
    for gene in sortedTotalPlays:
        for item in sortedTotalList:
            if gene[0] == item[0] and count != 2:
                answer.append(item[2])
                count+=1
        count=0
    
    return answer

 

리스트를 두개를 썻는데 sortedTotalList의 경우 장르-재생횟수로 오름차순 정렬한 것이고

sortedTotalPlays의 경우 가장많이 재생된 장르를 정렬한 것이다.

그후 이중 for으로 각 장르를 탐색하여 문제를 풀게 되었다.

어차피 두곡씩 뽑으면 다음장르를 탐색하도록 넘겨야 하므로 이중포문을 그냥 썻다.

 

다중 조건 정렬과 관련된 것은 아래 블로그에 잘 설명되어있다.

(만약 이해가 안되면 다중조건정렬 로 검색해서 찾아보면 된다)

https://dailyheumsi.tistory.com/67

 

파이썬 정렬, 다중 조건으로 한 번에 하기.

파이썬으로 문제를 풀다보면, 여러 조건으로 소팅을 해야하는 경우가 있다. 일반적인 소팅은 다음과 같이 sorted() 혹은 .sort() 를 사용한다. a = [4,1,2,5,7,3,6] b = sorted(a) # b = [1,2,3,4,5,6,7] sorted()..

dailyheumsi.tistory.com

 

-끝-