문제
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;
}
'ALGORITHM > C++ - 프로그래머스' 카테고리의 다른 글
[프로그래머스] 의상 (2) | 2023.11.22 |
---|---|
[프로그래머스] 입국심사 (1) | 2023.11.22 |
[프로그래머스] 신고 결과 받기 (0) | 2023.11.01 |
댓글