본문 바로가기
algorithm/programmers

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

by 권성호 2021. 10. 6.

1.  문제 링크

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

 

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

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

programmers.co.kr

 

2.  풀이

 

<languages, preference>로 map을 만든다.

Table을 하나하나 읽으면서 빈칸을 기준으로 string을 파싱 하고 map을 조회해 선호도 점수를 얻으며 직종 별 점수를 계산한다.

계산이 끝나면 최대 점수를 업데이트 하고 이때 직종도 같이 업데이트해 준다.

 

(점수가 같을 시 사전순으로 앞에 있는 것을 출력하기 위해 처음에 table을 정렬해 준다)

 

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

using namespace std;

map<string,int> myMap;

//table         직업군 언어 점수를 정리한 문자열 배열 
//languages     개발자가 사용하는 언어를 담은 문자열 배열
//preference    언어 선호도를 담은 정수 배열 
string solution(vector<string> table, vector<string> languages, vector<int> preference) {
    sort(table.begin(),table.end());
    myMap.clear();
    for(int i = 0 ; i < languages.size();i++)
        myMap.insert({languages[i], preference[i]});
    
    string ans = "";
    int maxScore =  -1;
    for(string ele: table){
        //하나의 직종에 대한 점수(currentScore) 계산
        int blankCnt = 0;
        string tmpStr = "";
        int currentScore = 0;
        string currentJob;
        for(char c: ele){
            if(c == ' '){
                if(blankCnt == 0)
                    currentJob = tmpStr;
                else{
                    if(myMap.find(tmpStr) != myMap.end())
                        currentScore += (6 - blankCnt) * myMap[tmpStr];
                }
                
                tmpStr = "";
                blankCnt++;
            }
            else{   //c가 빈칸이 아닐 때
                tmpStr.push_back(c);
            }
        }
        currentScore += (6 - blankCnt) * myMap[tmpStr];
        
        if(maxScore < currentScore){
            maxScore = currentScore;
            ans = currentJob;
        }
    }
    //[개발자가 사용하는 언어의 언어 선호도 x 직업군 언어 점수의 총합]이 가장 높은 직업군을 return
    return ans;
}

댓글