본문 바로가기
코딩 테스트/프로그래머스

[해시] 베스트 앨범

by 위그든씨 2023. 4. 6.

문제 설명

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이

  • 구해야 할 값은 각 장르의 총 합, 해당 장르에서의 최대 재생횟수 2개 추출 
  • 어떤 장르들이 있는지 알기 위해 장르 리스트를 집합화 시켜서 중복을 없애고 다시 리스트화 시켜줌(index 처리를 위해)
  • 어떤 값이 최솟값이 될지 모르므로 "a"라는 장르는 -1 번 이라는 고정값을 넘겨주기 위해 gens와plays에 "a",-1 추가
  • g라는 리스트는 각 행에 [해당 장르 총 재생수, 최대 재생 고유 넘버, 2번째로 많이 재생된 고유 넘버] 정보가 담김
  • 2번째 최대 재생 수보다 현재 알아볼려는 값이 더 작더면 continue, 최대 재생 수와 동일하다면 고유 넘버가 낮은 것부터 출력되므로 2번째 넘버에 넣어줌
  • 최대보다 크다면 [현재 넘버, 이전 최대 넘버] 
  • 최대와 2번째 최대 사이라면 [최대 넘버, 현재 넘버] 

소스 코드

def solution(gens, plays):
    answer = []
    s = list(set(gens))
    n = len(s)
    m=len(gens)
    gens=["a"]+gens
    plays=[-1]+plays
    g = [[0,0,0] for i in range(n+1)] 
    for i in range(1,m+1):
        idx = s.index(gens[i])
        a,b= g[idx][1:]
        play = plays[i]
        A,B = plays[a],plays[b]

        g[idx][0]+=play
        if play<=B:
            continue
        elif play==A:
            g[idx][1:]=[a,i]
        elif play>A:
            g[idx][1:]=[i,a]
        else:
            g[idx][1:]=[a,i]
    g.sort(key=lambda x:-x[0])
        
    for i in range(n+1):
        a, b = g[i][1]-1,g[i][2]-1
        if a!=-1:
            answer.append(a)
        if b!=-1:
            answer.append(b)

    return answer

print(solution(["classic", "pop", "classic", "classic", "pop"],[500, 600, 150, 800, 2500]))