스터디/코딩테스트

python 코딩테스트 - 베스트 앨범

공대생철이 2023. 11. 7. 00:03
728x90

처음 든 생각

- 일단 카테고리 별로 정리한다

- 카테고리별 정리를 하되 각각의 인덱스와 값에 대하여 접근해야 하므로 딕셔너리 자료형을 사용한다.

- 총합을 기준으로 카테고리별 정렬을 한 다음 두개씩 append를 해준다.

 

나의 답

def solution(genres, plays):
    answer = []
    a = {}
    for i in range(len(plays)):
        if genres[i] in a:
            a[genres[i]].append((plays[i],i))
        else:
            a[genres[i]] = [(plays[i], i)]
    
    b = list(a.keys())
    c = []
    for i in a.values():
        i.sort(key = lambda x:x[0],reverse=True)
    for i in a.values():
        s = 0
        for j in range(len(i)):
            s += i[j][0]
        c.append(s)
    z = list(zip(b,c))
    z.sort(key = lambda x : x[1],reverse=True)
    for i in z:
        items = a[i[0]]
        if len(items) > 1:
            answer.append(items[0][1])
            answer.append(items[1][1])
        else:
            answer.append(items[0][1])
    return answer

모든 데이터를 정리하여 담은 딕셔너리 a를 선언해준다.

 

딕셔너리에 키 값이 존재하는지 판단하여 튜플 형태로 (값, 인덱스)를 value로 넣어준다.

 

다음 각 장르 안에 value들을 내림차순으로 정렬한다. -> lambda 함수, reverse 여부 잘 확인!

 

정렬된 값에 대해서 장르별 총 재생횟수를 구한 후 리스트에 넣어준다. 장르의 순서와 총 재생횟수의 인덱싱이 동일하므로 이를 zip으로 묶어주어 (장르, 총 재생횟수)로 분류를 해준다. 그 다음 총 재생횟수를 기준으로 내림차순으로 정렬한다. 그렇게되면 카테고리별 우선순위가 확정이 된다.

 

카테고리별 우선순위가 확정되었으니 순서대로 반복문을 돌면서 인덱스를 차례차례 append를 해준다. 이 부분에서 조건을 놓쳐 실제 테스트 케이스에서는 2개가 계속 틀렸다. 

 

조건을 보면 재생횟수가 같은 노래 중에서는 고유번호가 낮은 노래를 먼저 수록한다고 언급되어있다. 위 코드에 따르면 (800, 0), (600,1), (800,2)가 있어도 sort를 할 때 값 차이가 없어 자동으로 인덱스가 낮은 튜플이 앞에 온다 -> ex. (800,0), (800,2), (600,1)

 

처음 풀 때는 이 조건을 고려하지 않고 바로 list.index 형식으로 접근하여 에러가 났다. 같은 값이 여러개 등장해도 무조건 첫번째로 발견한 인덱스 값을 리턴하기 때문이다.

 

이 문제를 풀 때 관리해야할 것은 총 3개였다. 카테고리, 재생 횟수, 재생횟수의 인덱스

 

관리 대상에 대한 파악을 문제를 통해서 확인한 후에 코드를 구성하도록 복습하자.

그래도 첫 레벨 3 문제였는데 테스트 케이스 15개 중 13개를 맞췄다는 부분에 대해서는 조금 뿌듯했다.

728x90