[プログラマー][C++]推薦防衛挑戦4週間職業群


質問する


提问链克-推荐职业群


に答える


アルゴリズム#アルゴリズム#

  • として入力されたテーブルのすべての列をスペース文字で再編成します.
  • vector<vector<string>> new_table = TableOrganize(table);

    2.new table,languages,preferenceを用いて問題要求の戻り値「言語嗜好度x職業群言語点数総和が最も高い職業群」を求める.
    string answer = FindHighScoreJob(new_table, languages, preference);
  • for (int l = 0; l < languages.size(); l++)与えられた言語の1つをinputでキャプチャします.
  • for (int i = 0; i < new_table.size(); i++)new tableの行を繰り返す(5つの職業群)
  • for (int j = 1; j < new_table[i].size(); j++)重複new tableのカラム(5言語)タイプ
    new table[i][j]とlanguage[l]が同じ場合
    「scopse[i]+=言語嗜好度x職業群言語点数」
  • コード#コード#

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    vector<vector<string>> TableOrganize(vector<string> table);
    string FindHighScoreJob(vector<vector<string>> new_table, vector<string> languages, vector<int> preference);
    
    string solution(vector<string> table, vector<string> languages, vector<int> preference)
    {
        //테이블 재구성
        vector<vector<string>> new_table = TableOrganize(table);
    
        //가장 높은 점수를 얻은 직업군 탐색
        string answer = FindHighScoreJob(new_table, languages, preference);
    
        return answer;
    }
    
    //{SI, JAVA, JAVASCRIPT, SQL, PYTHON, C#}, ... 공백 기준으로 열을 잘라서 재구성
    vector<vector<string>> TableOrganize(vector<string> table)
    {
        vector<vector<string>> new_table(5);
    
        for (int i = 0; i < table.size(); i++)
        {
            string temp = "";
            for (int j = 0; j < table[i].size(); j++)
            {
                if (table[i][j] != ' ')
                    temp += table[i][j];
                else
                {
                    new_table[i].push_back(temp);
                    temp = "";
                }
            }
            new_table[i].push_back(temp);
        }
    
        return new_table;
    }
    
    string FindHighScoreJob(vector<vector<string>> new_table, vector<string> languages, vector<int> preference)
    {
        vector<int> scores(5);
    
        //조사할 언어만큼 반복
        for (int l = 0; l < languages.size(); l++)
            //5개 직업군만큼 반복
            for (int i = 0; i < new_table.size(); i++)
                //5개 언어 종류만큼 반복
                for (int j = 1; j < new_table[i].size(); j++)
                    if (new_table[i][j] == languages[l])
                        scores[i] += preference[l] * (6 - j);
    
        int maxV = *max_element(scores.begin(), scores.end());
    
        vector<string> temp;
        for (int i = 0; i < 5; i++)
            if (scores[i] == maxV)
                temp.push_back(new_table[i][0]);
    
        return *min_element(temp.begin(), temp.end());
    }

    コメントコード

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    vector<string> table = {"SI JAVA JAVASCRIPT SQL PYTHON C#",
                            "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++",
                            "HARDWARE C C++ PYTHON JAVA JAVASCRIPT",
                            "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP",
                            "GAME C++ C# JAVASCRIPT C JAVA"};
    vector<string> languages = {"PYTHON", "C++", "SQL"};
    vector<int> preference = {7, 5, 5};
    
    vector<vector<string>> TableOrganize(vector<string> table);
    string FindHighScoreJob(vector<vector<string>> new_table, vector<string> languages, vector<int> preference);
    
    string solution(vector<string> table, vector<string> languages, vector<int> preference)
    {
        //테이블 재구성
        vector<vector<string>> new_table = TableOrganize(table);
    
        //가장 높은 점수를 얻은 직업군 탐색
        string answer = FindHighScoreJob(new_table, languages, preference);
    
        return answer;
    }
    
    //{SI, JAVA, JAVASCRIPT, SQL, PYTHON, C#}, ... 공백 기준으로 열을 잘라서 재구성
    vector<vector<string>> TableOrganize(vector<string> table)
    {
        //재구성할 테이블 원소들을 담을 2차원 배열
        vector<vector<string>> new_table(5);
    
        //table 행 길이만큼 반복
        for (int i = 0; i < table.size(); i++)
        {
            string temp = "";
            //table 열 길이만큼 반복
            for (int j = 0; j < table[i].size(); j++)
            {
                //table[i][j]가 공백이 아니라면
                if (table[i][j] != ' ')
                    //temp에 table[i][j]를 더해줌
                    temp += table[i][j];
                else
                {
                    //table[i][j]가 공백이라면 새로운 테이블에 temp를 넣어주고
                    new_table[i].push_back(temp);
                    //temp를 비워줌
                    temp = "";
                }
            }
            //table[i]의 마지막 원소가 공백이 아니므로 따로 1점짜리 언어를 넣어줌
            new_table[i].push_back(temp);
        }
    
        return new_table;
    }
    
    string FindHighScoreJob(vector<vector<string>> new_table, vector<string> languages, vector<int> preference)
    {
        vector<int> scores(5);
    
        //조사할 언어만큼 반복
        for (int l = 0; l < languages.size(); l++)
            //5개 직업군만큼 반복
            for (int i = 0; i < new_table.size(); i++)
                //5개 언어 종류만큼 반복
                for (int j = 1; j < new_table[i].size(); j++)
                    // ex1) new_table[0][4]==languages[0]
                    // ex1) PYTHON==PYTHON
                    if (new_table[i][j] == languages[l])
                        // ex1) scores[0] += 7 * (6 - 4);
                        scores[i] += preference[l] * (6 - j);
    
        //maxV = 직업군별 점수 중 가장 높은 점수
        int maxV = *max_element(scores.begin(), scores.end());
    
        vector<string> temp;
        //가장 높은 점수가 2개 이상일 수 있으므로
        //5개 직업군만큼 반복하며 maxV와 같은 scores[i] 값이 있다면 temp에 저장
        for (int i = 0; i < 5; i++)
            if (scores[i] == maxV)
                temp.push_back(new_table[i][0]);
    
        //temp에 저장된 값 중 가장 작은 값(사전 순으로 가장 빠른 직업군) return
        return *min_element(temp.begin(), temp.end());
    }
    
    int main()
    {
        cout << solution(table, languages, preference);
    }

    おしゃべり


    なぜか3週目より簡単になった...
    WeeklyChallengeが何週目まで続くかはわかりませんが、3週目は難易度が高いので難易度調整段階に入ったようです.
    それに比べて、これは2週目とあまり差がない問題のようです.
    この問題は,ビューで与えられたテーブルと実際のinputで与えられたテーブルの行と列が逆で,少し混同されているほか,難しい点はない.
    データテーブルから必要な情報を見つけ、文字列を処理できれば、誰でも解くことができます.
    今後2~3週間程度で問題を見てこそ、今後どの程度の問題が発生するかを予測することができる.
    これは今日発表された問題で、3週間が終わった336人、4週間が終わった551人を簡単に上回った.