본문 바로가기

알고리즘/프로그래머스

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

문제를 정리해보자.

 

노래를 수록해야 한다. 그 기준은 아래와 같다. 

1. 속한 노래가 많이 재생된 장르를 먼저 수록한다.

2. 장르 내에서 많이 재생된 노래를 먼저 수록한다. (재생 횟수가 같다면? 고유 번호가 낮은 노래를 먼저 수록한다.)

 

1번과 2번을 위한 딕셔너리를 각각 만들었다. 전자는 genres_sum, 후자는 genres_two_plays.

 

1번은 각 장르의 노래 재생 수를 다 더하면 된다.

2번은 조건문을 이용했다. 아래 예시로 설명하겠다.

 

 

프로그래머스 예시

 

classic은 500, 150, 800을 가지고 있다. 그리고 pop은 600, 2500을 가지고 있다.

 

classic은 800, 500, 150 순서가 되어야하고, 2개만 선택해야 하니까 800, 500만 남아야 한다.

따라서 재생 수가 높은 순으로 넣고, 재생 수가 같다면 고유 번호가 낮은 것을 넣었다.

(넣기만 하면 안 된다. 항상 리스트는 길이가 최대 3이게 해서 다음 연산을 최소화 해야 한다.)

 

추가로 고유번호 중복에 대해 예시를 들어 생각해보자.

예시에 pop이 600으로 고유 번호 5를 가지고 있는 것을 추가 한다면, 결과에는 변화가 없다.

600으로 중복되는 것이 있지만, 고유 번호가 낮은 것(고유 번호 1)이 들어가기 때문이다.

 

 

 

아래는 쉬운 예로 2번을 그림으로 표현한 것이다.

 

 

 

 

500 -> 500 150 -> 400 500 150 -> 400 500 

 

 

 

def solution(genres, plays):
    genres_sum = {}
    genres_two_plays = {}

    for n in range(len(genres)):
        g = genres[n]
        p = plays[n]

        print(g, p)

        if genres_sum.get(g, 0):
            genres_sum[g] += p

            for i in range(len(genres_two_plays[g])):
                if genres_two_plays[g][i][0] < p or (genres_two_plays[g][i][0] == p and n < genres_two_plays[g][i][1]):
                    genres_two_plays[g].insert(i, (p, n))
                    break

            genres_two_plays[g].append((p, n))
            genres_two_plays[g] = genres_two_plays[g][:2]

        else:
            genres_sum[g] = p
            genres_two_plays[g] = [(p, n)]

    print(genres_sum, genres_two_plays)

    answer = []
    for g_name in sorted(genres_sum, key=lambda x : genres_sum[x], reverse=True):
        for val in genres_two_plays[g_name]:
            answer.append(val[1])

    return answer

 

 

 

람다[lambda]에 대해 알아보자.

익명함수이다. 이름이 없는 함수라는 뜻이다. 

람다 또한 객체이다. 변수에 담고 매개변수를 줄 수 있다.  

 

lambda 매개변수 : 결과

 

 

def hap(x, y):
    return x + y

print(hap(10, 20))


print((lambda x, y: x + y)(10, 20))

f = lambda x, y: x + y
print(f(10, 20))

 

 

 

lambda와 sorted 사용 예를 보자.

 

 

s = ['A\n', 'C\n', 'D\n', 'B\n']

print(sorted(s, key=lambda x: x.strip()))