티스토리 뷰

반응형

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직군을 추천해주는 문제

 


문제의 조건

 

1. 직군 이름과 직군별로 많이 사용하는 언어 top5가 담긴 배열 table이 주어진다. (총 사이즈 6 = 직군 이름  1개 + 언어 5개)

순위가 높을수록 점수가 높다. 

따라서 맨 앞에 있는 언어는 5점, 맨 뒤에 있는 언어는 1점임

-> 인덱스 번호에 따른 점수 계산을 쉽게 하기 위해 언어가 저장된 순서를 뒤집어줘야 함

 

2. 개발자가 사용하는 언어를 담은 배열 languages가 주어짐

언어는 1개 ~ 9개까지 들어있을 수 있다.

 

3. 언어별 선호도를 담은 배열 preference가 주어짐 

languages 배열에 저장된 언어 순서대로 개발자가 선호하는 점수가 담긴 배열임 

languages와 1:1 대응된다.

 

4. 개발자가 사용하는 언어의 언어 선호도 x 직업군 언어 점수의 총합이 가장 높은 직업군을 리턴해야 함

만약 점수가 같으면 사전 순으로 빠른 직업군을 리턴함

-> 직군별로 총점을 저장하는 map을 만들고 최대 value값을 찾은 후 그 value값을 이용해 key값을 찾는다.

(map으로 저장하면 자동 오름차순 정렬이라 정렬에는 신경 안 써도 됨)

 


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

using namespace std;

string solution(vector<string> table, vector<string> languages, vector<int> preference) {
    //업종별로 언어 잘라서 2차원 테이블 만듦 
    vector<vector<string>> scoreTable(5, vector<string>(6));
    for (int i = 0; table.size() > i; i++)
    {
        stringstream ss(table[i]);
        string tmp;
        ss>>tmp;
        scoreTable[i][0] = tmp; //첫번째 단어는 직업이기 때문에 맨 앞에 저장

        int j = 5;
        while (ss>>tmp)
        {
            //점수 계산하기 쉽게 점수가 낮은 언어부터 낮은 인덱스에 저장 
            scoreTable[i][j--] = tmp;
        }
    }

    map<string, int> scoreMap;
    for (int i = 0; scoreTable.size() > i; i++)
    {
        int score = 0;
        for (int j = 0; languages.size() > j; j++)
        {
            //각 직업군별로 선호도 언어가 있는지 찾기
            auto first = scoreTable[i].begin();
            auto it = find(scoreTable[i].begin(), scoreTable[i].end(), languages[j]);
            if (scoreTable[i].end() != it)
            {
                //해당 언어 인덱스(점수) 구하기
                int dist = distance(first, it);
                score += (dist*preference[j]);
            }
        }
        //key: 직업 이름, value: 총점 으로 저장하면 map이 알아서 key값 기준 오름차순으로 정렬해 줄 것임
        scoreMap.insert(pair<string, int>(scoreTable[i][0], score));
    }

    //value를 이용해 key값을 찾는다. 
    auto it = max_element(
        scoreMap.begin(), scoreMap.end(), 
        [] (const pair<string, int>& p1, const pair<string, int>& p2)->bool {
                              if (p1.second < p2.second)
                                  return true;
                              if (p1.second == p2.second)
                                  return p1.first > p2.first;
                              return false;
                          });
    string answer = it->first;

    return answer;
}

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함