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

[해시] Level 3 베스트앨범 - C++

by 의정부핵꿀밤 2021. 12. 26.
728x90

걍 파이썬만 할걸 그랬나

계속 c++에 집착중,,,

거의 다 된 것 같은데 일단 틀린 코드

 

틀린 코드

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

using namespace std;

bool cmp(const pair<string,int>& a, const pair<string,int>& b) {
	if (a.second == b.second) return a.first < b.first;
	return a.second < b.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, int> total;
    multimap<string, int> gen_play;
    map<int, int> play_num;
    //map<string,pair<int,int>> gen_map;
    
    for(int i=0;i<genres.size();i++)
    {
        total[genres[i]]+=plays[i];
        gen_play.insert(pair<string, int>(genres[i],plays[i]));
        play_num[plays[i]]=i;
    }
    
    vector<pair<string,int>> vec_total( total.begin(), total.end() );
	sort(vec_total.rbegin(), vec_total.rend(), cmp);
    
    for(int i=0;i<vec_total.size();i++)
    {
        string genre = vec_total[i].first;
        vector<int> playlist; //현재 장르의 재생횟수
        // key = genre인 원소들 탐색
	    for (auto it = gen_play.lower_bound(genre); it != gen_play.upper_bound(genre); it++) 
        {
            playlist.push_back(it->second);
	    }
        sort(playlist.rbegin(),playlist.rend());
        answer.push_back(play_num[playlist[0]]);
        if(playlist.size()>1)
        {
            answer.push_back(play_num[playlist[1]]);
        }

        
    }
    
    return answer;
}

이러면 정확성에서 2개정도 틀린다

내가 처음에는 각 장르당 2개씩 뽑아오는걸 무조건 2개로 했더니 틀렸다

그래서 문제를 다시 읽어보니까 장르별 노래가 1개면 1개만 가져오라네?

그거 보자마자 거기 수정함

그래서 첫번쨰 노래는 일단 가지고 오고, 만약에 벡터 크기가 2이상이면 그때만 2번째 노래 가지고 오도록 수정!

그랬더니 2개 케이스가 틀렸다고 한다

뭐가 문제일까 봤더니 장르별로 노래 재생횟수가 다르다고 했지 모든 노래의 재생횟수가 다르다고는 안했더라,,

그래서 map 구조를 바꿔서 다시 구현해야 할 것 같다

여기서는 그냥 map을 3개로 쪼개서 했거든

그 중에 하나가 key를 재생횟수로 갖고 value가 고유 번호인 map인데 이렇게 하면 다른 장르에서 재생횟수가 같은 노래가 있을수도 있어서 오류가 나는것 같더라고

그래서 걍 장르를 key로 갖고 pair로 value를 만들어서 재생횟수랑 고유번호 저장하려고

거의 다 한것 같으니까 이거만 마지막으로 고쳐볼게!

 

야 고쳤는데 또 똑같은 케이스에서 나감

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

using namespace std;

bool cmp(const pair<string,int>& a, const pair<string,int>& b) {
	if (a.second == b.second) return a.first < b.first;
	return a.second < b.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, int> total;
    multimap<string,pair<int,int>> gen_map;
    
    for(int i=0;i<genres.size();i++)
    {
        total[genres[i]]+=plays[i];
        gen_map.insert(make_pair( genres[i], make_pair(plays[i],i) ));
    }
    
    vector<pair<string,int>> vec_total( total.begin(), total.end() );
	sort(vec_total.rbegin(), vec_total.rend(), cmp);
    
    for(int i=0;i<vec_total.size();i++)
    {
        string genre = vec_total[i].first;
        cout<<genre<<"\n";
        vector<pair<int,int>> playlist; //현재 장르의 재생횟수

        for (auto it = gen_map.lower_bound(genre); it != gen_map.upper_bound(genre); it++) 
        {
            playlist.push_back(it->second);
	    }
        sort(playlist.rbegin(),playlist.rend());
        answer.push_back(playlist[0].second);
        if(playlist.size()>1)
        {
            answer.push_back(playlist[1].second);
        }
    }
    
    return answer;
}

일단 프로그래머스에 질문 등록해둠

나중에 답변오면 수정하러옴 ㅅㄱ

파이썬 공부하러 간다,,,ㅠ

728x90

댓글