[프로그래머스/C++] 알고리즘 고득점 키트 - 베스트앨범

2025. 7. 4. 16:03·PS/Programmers

문제와 예시 입출력

 


나의 접근 방법

일단 장르별로 어떤 장르가 가장 재생이 많이 됐는지 확인해야 해서

장르별 총 재생 횟수를 담는 해시 맵을 하나 생성했다.

-> 아래 코드에서 hMap에 해당한다.

 

그 다음 단계로 해야하는 것은

1) 가장 인기 있는 장르를 찾아서 

2) 그 장르 내에서 가장 많이 재생된 노래 2곡의 고유 번호를 찾는것이다.

 

그러면 해시맵으로 저장해놓은 자료구조 (hMap)에서 가장 인기 있는 장르를 찾아야하는데,

해시를 정렬할 수는 없으니... 비효율적인 것 같으나 벡터를 하나 더 만들어서 장르 이름과 장르별 총 재생횟수를 담았다. 

-> 아래 코드에서 top_genres에 해당한다.

그렇게 만들어진 벡터 top_genres를 재생횟수에 맞춰 정렬했다. (comp 오버로딩을 했다.)

 

그리고 하나의 벡터를 더 만들었는데,

가장 인기 있는 장르 내에서, 가장 많이 재생된 곡 2개를 뽑아서, 고유 번호를 출력해야했기 때문에,

장르 따로, 재생횟수 따로 있는 데이터들을 하나로 다룰 필요가 있었다.

그래서 genre_play 벡터를 만들었고, 이 벡터는 (장르,(고유번호,재생횟수))를 가지고 있다.

이 genre_play도 재생횟수를 기준으로 내림차순 정렬해준다. (comp2 커스텀)

이렇게 정렬을 한 이유는 아래에서 장르 이름을 가지고 2개의 곡만 찾을 때, 앞에서 2개만 찾으려고 하기 위함이다.

 

그러면 이제 최종적으로 top_genres에 있는 장르 이름을 가지고

genre_play에서 검색하면서 cnt 변수로 최대 2개까지만 찾으며

곡의 고유 번호를 answ 벡터에 넣어 출력한다.

 


 

코드 

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

bool comp2(const pair<string, pair<int,int>> &a, const pair<string, pair<int,int>> &b){
    return a.second.second > b.second.second;
    
}
bool comp(const pair<string,int> &a, const pair<string,int> &b){
    return a.second > b.second;
    
}
vector<int> solution(vector<string> genres, vector<int> plays) {
    int temp = 0;
    unordered_map<string,int> hMap;
    vector<pair<string,int>> top_genres;
    vector<pair<string, pair<int,int>>> genre_play;
    vector<int> answer;
    
    for (int i=0;i<genres.size();++i){
        hMap[genres[i]]+=plays[i];
        genre_play.push_back(make_pair(genres[i],make_pair(i,plays[i])));
    }
    
    for (auto a: hMap){
        top_genres.push_back(make_pair(a.first,a.second));
    }
    
    sort(top_genres.begin(),top_genres.end(),comp);
    sort(genre_play.begin(),genre_play.end(),comp2);

    for(int i=0;i<top_genres.size();++i){
        int cnt =0;    
        for (auto a: genre_play){
            if (a.first==top_genres[i].first && cnt<2){
                answer.push_back(a.second.first);
                cnt++;
            }
        }  
    }
    return answer;
}
:: 간단 요약 :: 
- 장르별 총 재생 횟수를 저장하기 위해 unordered_map<string, int> hMap을 만든다.
- 각 노래 정보를 (장르, (고유번호, 재생횟수)) 형태로 저장하는 vector<pair<string, pair<int,int>>> genre_play도 만든다.
- hMap의 내용을 (장르, 총 재생 횟수) 쌍으로 옮겨 top_genres 벡터에 저장한다.top_genres는 총 재생 횟수를 기준으로 내림차순 정렬해서 인기 장르 순으로 정렬한다.
- genre_play는 각 노래의 재생횟수를 기준으로 내림차순 정렬해서, 특정 장르 내에서 인기 노래가 앞에 오도록 정렬한다.
- 정렬된 top_genres 순서대로, genre_play에서 해당 장르 노래를 찾아 최대 2곡씩 결과 벡터 answer에 추가한다. 

위에 너무 횡설수설 작성한 것 같아서 한 번 더 정리해봤다!
저작자표시 비영리 변경금지 (새창열림)

'PS > Programmers' 카테고리의 다른 글

[SQL] SQL NULL값인 컬럼 처리하기 (IFNULL)  (0) 2026.01.07
[프로그래머스/C++] Level1 - 2016년 풀이  (0) 2025.12.07
[프로그래머스/C++] 가장 가까운 같은 글자 (lv1)  (0) 2025.10.21
[프로그래머스/C++] 알고리즘 고득점 키트 - 체육복  (0) 2025.05.21
[프로그래머스/C++] 알고리즘 고득점 키트 - K 번째 수  (0) 2025.05.20
'PS/Programmers' 카테고리의 다른 글
  • [프로그래머스/C++] Level1 - 2016년 풀이
  • [프로그래머스/C++] 가장 가까운 같은 글자 (lv1)
  • [프로그래머스/C++] 알고리즘 고득점 키트 - 체육복
  • [프로그래머스/C++] 알고리즘 고득점 키트 - K 번째 수
Lyv
Lyv
  • Lyv
    inimizi
    Lyv
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 이것저것 도전 (5)
        • 공모전 (0)
        • 우테코 (5)
      • PS (16)
        • 삼성기출 (2)
        • LeetCode & Codility (4)
        • Programmers (6)
        • BaekJoon (4)
      • 공부기록 (33)
        • CS (16)
        • 영어 (1)
        • iOS (1)
        • 프로그래밍 언어 (0)
        • Web (4)
        • Linux (1)
        • Docker (2)
        • Network (4)
        • IaC (3)
      • 프로젝트 경험 (0)
      • DailyLog (4)
      • 취준Log (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    운영체제
    운영체제intro
    코테
    우테코
    백준
    컨테이너
    스케줄링
    프리코스회고
    리눅스
    자동화
    정처기실기
    PS
    IAC
    우테코프리코스
    FastAPI
    manifest
    프로그래머스
    대학생
    C++
    DP
    이미지
    os
    문제풀이
    ansible
    네트워크
    til
    c언어
    공부기록
    정처기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Lyv
[프로그래머스/C++] 알고리즘 고득점 키트 - 베스트앨범
상단으로

티스토리툴바