๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[C++/PGS] Lv.3 : ๋ฒ ์ŠคํŠธ์•จ๋ฒ” (ํ•ด์‹œ / map์ •๋ ฌ)

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

 

๋ฌธ์ œ ์„ค๋ช…

์ŠคํŠธ๋ฆฌ๋ฐ ์‚ฌ์ดํŠธ์—์„œ ์žฅ๋ฅด ๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋‘ ๊ฐœ์”ฉ ๋ชจ์•„ ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์„ ์ถœ์‹œํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋ž˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ๋…ธ๋ž˜๋ฅผ ์ˆ˜๋กํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์†ํ•œ ๋…ธ๋ž˜๊ฐ€ ๋งŽ์ด ์žฌ์ƒ๋œ ์žฅ๋ฅด๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.
  2. ์žฅ๋ฅด ๋‚ด์—์„œ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.
  3. ์žฅ๋ฅด ๋‚ด์—์„œ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋…ธ๋ž˜ ์ค‘์—์„œ๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋ž˜์˜ ์žฅ๋ฅด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด genres์™€ ๋…ธ๋ž˜๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด plays๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์— ๋“ค์–ด๊ฐˆ ๋…ธ๋ž˜์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.


 

์€๊ทผ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ์ธ๋ฐ ์ผ๋‹จ map ์ž๋ฃŒํ˜•์„ ๋‹ค๋ฃฐ ์ค„ ์•Œ์•„์•ผ ํ•˜๊ณ ,

์ด๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ใ… ใ… 

 

map์€ ๊ธฐ๋ณธ์ ์œผ๋กœ key ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ key ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์„ ์œ„ํ•ด์„œ๋Š” map ์„ ์–ธ ์‹œ greater<์ž๋ฃŒํ˜•> ์†์„ฑ์„ ๋„ฃ์–ด์ค˜์•ผํ•จ!!

 

๊ทธ๋ฆฌ๊ณ  value ๊ธฐ์ค€ ์ •๋ ฌ์„ ์œ„ํ•ด์„œ๋Š” map์„ vector๋กœ ๋ฐ”๊ฟ”์„œ ์ •๋ ฌํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์„ ์–ธํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

 

 ๋‚˜์˜ ํ’€์ด

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

bool comp(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> plist; // ์žฅ๋ฅด๋ณ„ ์ด ์žฌ์ƒํšŸ์ˆ˜
    map<pair<int,int>,string,greater<pair<int,int>> > pnums; //key๋‚ด๋ฆผ์ฐจ์ˆœ ์ž๋™์ •๋ ฌ
    for(int i=0; i<genres.size();++i){
        plist[genres[i]] += plays[i];
        pnums[{plays[i], genres.size()-1-i}] = genres[i];
    }
    
    vector<pair<string,int> > v(plist.begin(),plist.end());
    sort(v.begin(),v.end(),comp); // value ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
    
    for(int i=0; i<v.size();++i){ // ์žฅ๋ฅด ์„ ํƒ
        string g = v[i].first;
        int cnt=0;
        for(auto j : pnums){
            if(j.second == g){
                int a = j.first.second;
                answer.push_back(genres.size()-1-a);
                cnt++;
            }
            if(cnt==2) break;
        }
    }
    
    return answer;
}

 

+ resolve ํ’€์ด

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

bool compare(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> mgenres;
    map<pair<int,int>,string, greater<pair<int,int>> > mplays;
    for(int i=0; i<genres.size(); ++i){
        mgenres[genres[i]] += plays[i];
        mplays[{plays[i],10000-i}] = genres[i]; // {์žฌ์ƒํšŸ์ˆ˜,10000-๊ณ ์œ ๋ฒˆํ˜ธ}
    }
    // mgenres -> value์— ๋”ฐ๋ผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์„ ์œ„ํ•ด vector๋กœ ๋ณ€ํ™˜
    vector<pair<string, int>> v(mgenres.begin(), mgenres.end());
    sort(v.begin(), v.end(), compare);
    
    for(auto g:v){
        int cnt=0;
        string gen = g.first;
        for(auto p:mplays){
            if(p.second == gen){
                int a = 10000-p.first.second;
                answer.push_back(a);
                cnt++;
            }
            if(cnt==2) break;
        }
    }
    
    return answer;
}