본문 바로가기
Programming Solve/프로그래머스

프로그래머스 위클리 챌린지 4주차 - 직업군 추천하기 / C++

by msm1029 2021. 9. 23.
반응형

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/84325

 

코딩테스트 연습 - 4주차_직업군 추천하기

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부

programmers.co.kr

 

문제 풀이

주어지는 table 벡터는 ["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", ... ]과 같이 주어진다.

 

이를 편리하게 사용하기 위해서 string vector인 langs vector를 만들고 istreamstream을 통해서 띄어쓰기로 구분된 문자열을 입력할 수 있다.

 

예를 들어, table[0]에는 "SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++"가 있을 것이다. 이를 space로 구분하여 어느 string vector에 넣고 싶다면

 

istreamstream iss(table[0]);

while(iss >> tmp){

     langs.push_back(tmp);

}

같이 사용할 수 있다.

 

다음으로, languages vector와 preference vector도 편의성을 위해 pair로 묶어 pair vector인 p에 넣어준다.그렇다면 p벡터의 first들은 개발자가 사용하는 언어들이 모여있을 것이고, second에는 선호도가 담겨있을 것이다.

 

이제 table에 담겨있는 직군별 언어 점수를 선호도와 곱한 뒤, total에 계속해서 더해준다. 그 다음 ans 벡터에 해당 직군과 총점을 넣어준 뒤 정렬한다. 정렬할 때에는 점수가 가장 높은 것이 맨 처음으로 오게 하고, 같은 점수에서는 사전 순으로 가장 빠른 것이 맨 처음으로 오게 해서 추천 직군을 answer에 넣을 수 있도록 한다.

소스 코드

#include <bits/stdc++.h>
using namespace std;

bool cmp(pair<string, int> a, pair<string, int> b){
    if(a.second > b.second){
        return true;
    }
    else if(a.second == b.second){
        return a.first < b.first;
    }
    else return false;
}

string solution(vector<string> table, vector<string> languages, vector<int> preference) {
    string answer = "";
    vector<pair<string, int> > p;
    vector<pair<string, int> > ans;
    
    for(int i=0; i<languages.size(); i++){
        p.push_back(make_pair(languages[i], preference[i]));
    }
    
    for(int i=0; i<table.size(); i++){
        vector<string> langs;
        string tmp;
        int total = 0;
        istringstream iss(table[i]);
        while(iss >> tmp){
            langs.push_back(tmp);
        }
        
        for(int j=1; j<langs.size(); j++){
            for(int k=0; k<p.size(); k++){
                if(p[k].first == langs[j]){
                    total += p[k].second * (6-j);
                }
            }
        }
        ans.push_back(make_pair(langs[0], total));
    }
    
    sort(ans.begin(), ans.end(), cmp);
    answer = ans[0].first;
    return answer;
}

 

반응형