본문 바로가기

Algorithm/자료구조

(C++) - 프로그래머스(위클리 챌린지) : 4주차

반응형

https://programmers.co.kr/learn/courses/30/lessons/84325

 

코딩테스트 연습 - 4주차

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

programmers.co.kr

자료구조를 사용해보는 문제였습니다.

 

📕 풀이방법

📔 입력 및 초기화

각 직군별 언어와 점수가 저장된 table, 질의를 하는 언어가 담긴 languages, 해당 언어의 선호도가 저장된 preference를 solution함수의 parameter로 받습니다.

 

📔 풀이과정

 1. table의 직군별 언어들과 그 언어의 점수를 map변수 tableMap에 저장합니다. split은 c++에서 지원하지 않기 때문에 따로 구현했습니다. delimiter(구분자)와 문자열 input을 인자로 받아 매 구분자마다 문자열을 나누어 vector<string>형태로 반환해주는 함수입니다. 

 

 2. 직업별 점수를 저장할 map변수 scoreMap을 선언합니다. 만들어진 tableMap을 토대로 점수를 산정해 직군(job)을 key, 그 직군의 총 점수를 value로 해 저장합니다. 동시에 가장 높은 점수의 score는 maxScore에 저장합니다.

 

 3. 만들어진 scoreMap을 순회하며 maxScore와 같은 scoreMap.second를 찾고 찾았다면 바로 scoreMap.first(직군)을 반환해줍니다.

 


📕 Code

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

vector <string> split(string input, char delimiter){
    vector <string> result;
    stringstream ss(input);
    string tmp;

    while(getline(ss,tmp,delimiter)) result.push_back(tmp);
    return result;
}

string solution(vector<string> table, vector<string> languages, vector<int> preference) {
    string answer = "";
    map<string, map<string,int>> tableMap;

    for(auto t : table){
        vector <string> jobAndLanguage = split(t ,' ');
        string job = jobAndLanguage[0];

        map<string,int> tmpMap;

        for(int i = 1; i < jobAndLanguage.size(); i++){
            string language = jobAndLanguage[i];
            int score = 5 - i + 1;
            tmpMap[language] = score;
        } 
        tableMap[job] = tmpMap;
    }

    map<string,int> scoreMap;
    int maxScore = 0;
    for(auto tm: tableMap){
        int score = 0;
        string job = tm.first;
        map<string,int> scorePerLanguage = tm.second;
        for(int i = 0; i < languages.size(); i++){
            score += preference[i] * scorePerLanguage[languages[i]];
        }
        maxScore = max(maxScore,score);
        scoreMap[job] = score;
    }

    for(auto el : scoreMap){
        if(el.second == maxScore) return el.first;
    }
}