코딩테스트 준비/프로그래머스

[프로그래머스] - 베스트앨범(해시) c++

SeoburiFaust 2024. 2. 14. 18:48

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

접근방법

고민을 많이 했다. level 3인 만큼 생각할 게 많았다.

 

1. 장르별로 plays수를 저장해야하고, 그것을 정렬할 수 있어야했다.

Map에 우선 저장해놓고, vector<string, int>로 받아와 comparator1를 이용해 정렬했다.

map에 우선 저장을 해놓은 이유는 plays수를 합산하기 편해서이다.

 

2. plays수가 가장 많은 장르를 불러왔을 때, 그 장르에 속한 노래들의 고유번호를 알아내야 했다.

그리고 그 노래들을 정렬해서 플레이 수 많은 순으로 2개 씩 뽑아야 했다.

쉬운 방법이 없을까 고민했지만, 그냥 3개 데이터를 합쳐서 struct gpi를 만들어 해결했다.

 

 

코드

#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>

using namespace std;

struct gpi {
    string genres;
    int plays;
    int idx;
};

bool comparator2(gpi A, gpi B) {
    return A.plays > B.plays;
}

bool comparator1(pair<string, int> A, pair<string, int> B) {
    return A.second > B.second;
}

vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, int> genres_count;
    vector<gpi > genres_plays;
    vector<pair<string, int> > genres_count_sorted;
    for (int i=0;i<genres.size();i++) {
        genres_count[genres[i]] += plays[i];
        gpi temp; 
        temp.genres = genres[i]; temp.plays = plays[i]; temp.idx = i;
        genres_plays.push_back(temp);
    }
    for (auto& gcpair : genres_count) {
        genres_count_sorted.push_back(make_pair(gcpair.first, gcpair.second));
    }
    
    sort(genres_count_sorted.begin(), genres_count_sorted.end(), comparator1);
    sort(genres_plays.begin(), genres_plays.end(), comparator2);
    
    for (auto gcs : genres_count_sorted) {
        int cnt = 0;
           for (int i=0;i<genres.size();i++) {
               if (genres_plays[i].genres == gcs.first) {
                    answer.push_back(genres_plays[i].idx);
                    cnt++;
               }
               if (cnt == 2) break;
           }
    }
    return answer;
}

개선할 점

좀 더 쉬운 접근이 있을 거 같은 데 알아봐야겠다.

struct와 sort는 너무 유용하다. 고민하지 말고 익숙해지도록 자주 쓰자.