[プログラマー][C++]推薦防衛挑戦4週間職業群
33322 ワード
質問する
提问链克-推荐职业群
に答える
アルゴリズム#アルゴリズム#
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人を簡単に上回った.
Reference
この問題について([プログラマー][C++]推薦防衛挑戦4週間職業群), 我々は、より多くの情報をここで見つけました https://velog.io/@hhj3258/프로그래머스C-위클리-챌린지-4주차-직업군-추천하기-yo2769wbテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol