본문 바로가기
ALGORITHM/C++ - 프로그래머스

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

by DDongYeop 2023. 11. 1.
728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 분석 

장르의 이름과 몇번 재생이 되었는지 입력 되고, 가장 많이 재생된 장르부터 2개씩 가장 많이 재생된 순서를 출력해준다. 

 

 

알고리즘 설계 

우선 정답이 될 int만 가진 vector 1개, 몇번 플레이 됐는지와 몇번 인덱스인지 표시할 vector 1개, 장르 이름과 총 플레이된 횟수를 기록할 vector와 map

 

우선 몇번 플레이 됐는지, 몇번 인덱스인지 알려줄 vector에 각각의 값을 넣어주고,

장르의 이름과 플레이된 곡의 횟수를 map에 넣어주고 그 값을 vector로 옮겨준다. 

 

이후 값을 넣어둔 vector를 각각, 플레이 횟수 순으로 정렬를 해준다. 

 

이후 장르와 플레이된 곡의 횟수를 넣어둔 vector을 범위기반 for문을 돌려 준다. 

또 같이 몇번 플레이 됐는지와 몇번째 인덱스인지 넣어둔 vector를 범위기반 for문을 돌려 준다. 

 

만약  2번째 vector의 인덱스에 들어간 장르와 첫번쨰 vector의 vector의 장르가 같다면 미리 선언해둔 index를 높이고, 2 이상으로 올라갔다면 안쪽 for문을 끝내준다. 

미만이라면 정답이 될 vector에 넣어준다. 

 

 

유의점

상당히 꼬여있고, pair의 경우 정렬하려면 어떻게 정렬할지도 정해주어야하기에 그 부분을 유의하며 작성하여야한다. 

 

 

코드

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

using namespace std;

bool Compare1(pair<int, int> i, pair<int, int> j);
bool Compare2(pair<string, int> i, pair<string, int> j);

vector<int> solution(vector<string> genres, vector<int> plays)
{
    vector<int> answer;
    vector<pair<int, int>> vec;
    vector<pair<string, int>> checkVec;
    map<string, int> countM;


    for (int i = 0; i < plays.size(); ++i)
    {
        vec.push_back(make_pair(plays[i], i));
        countM[genres[i]] += plays[i];
    }
    for (auto p1 : countM)
        checkVec.push_back(p1);

    sort(vec.begin(), vec.end(), Compare1);
    sort(checkVec.begin(), checkVec.end(), Compare2);

    for (auto p1 : checkVec)
    {
        int index = 0;
        for (auto p2 : vec)
        {
            if (genres[p2.second] == p1.first)
            {
                index++;
                if (index > 2)
                    break;
                answer.push_back(p2.second);
            }
        }
    }

    return answer;
}

bool Compare1(pair<int, int> i, pair<int, int> j)
{
    return j.first < i.first;
}

bool Compare2(pair<string, int> i, pair<string, int> j)
{
    return j.second < i.second;
}
728x90

'ALGORITHM > C++ - 프로그래머스' 카테고리의 다른 글

[프로그래머스] 의상  (2) 2023.11.22
[프로그래머스] 입국심사  (1) 2023.11.22
[프로그래머스] 신고 결과 받기  (0) 2023.11.01

댓글