안녕하세요. 이번 포스팅에서는 프로그래머스 위클리 챌린지 4 직업군 추천하기 문제를 풀어보겠습니다.
https://programmers.co.kr/learn/courses/30/lessons/84325
위 링크에서 한번 도전해보시고 오시면 좋을 것 같습니다.
일단 이 문제는 문자열 + 구현 문제입니다. 큰 고민 없이 문제의 요구사항을 코드로 적어주시면 됩니다.
저의 경우는 우선 처음 table을 각각
SI, A, B, C, D, E ...
...
GAME, A, B, C, D, E...
이런 식으로 파싱을 먼저 한 뒤,
각각 입력값으로 주어진 language의 score를 preference와 함께 곱해준 다음 score라는 배열에 저장해두었습니다.
다시 score라는 배열을 순회하며 최댓값과 최댓값일 때 문자열을 저장해주었습니다.
* 최댓값이 같을 때 사전 순으로 먼저 오는 것을 고르라고 하였기 때문에 같다면 min 연산을 취해주시면 됩니다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
string parsingTable[10][12];
int score[10][12];
void parsing(int n, string cur) {
string tmp = "";
int idx=0;
for(int i = 0; i < cur.size(); i++) {
if(cur[i] != ' ') tmp+=cur[i];
else {
parsingTable[n][idx++] = tmp;
tmp = "";
}
}
parsingTable[n][idx] = tmp;
}
string solution(vector<string> table, vector<string> languages, vector<int> preference) {
string answer = "";
for(int i =0; i < table. size(); i++) parsing(i, table[i]);
for(int i = 0; i < table.size(); i++) {
string part = parsingTable[i][0];
for(int s = 0; s < languages.size(); s++) {
for(int j = 1; j <= 5; j++) {
if(parsingTable[i][j] == languages[s]) {
score[i][s] += (6-j) * preference[s];
}
}
}
}
string maxPart = ""; int maxScore = 0;
for(int i = 0; i < table.size(); i++) {
int totalScore = 0;
for(int s = 0; s < languages.size(); s++) {
totalScore += score[i][s];
}
if(totalScore > maxScore) {
maxScore = totalScore; maxPart = parsingTable[i][0];
} else if(totalScore == maxScore) {
if(maxPart == "") maxPart = parsingTable[i][0];
else maxPart = (maxPart < parsingTable[i][0])? maxPart : parsingTable[i][0];
}
}
answer = maxPart;
return answer;
}
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 후보키 (0) | 2021.09.01 |
---|---|
[Programmers] 위클리 챌린지 5주차 - 모음 사전 (0) | 2021.08.30 |
[Programmers] 위클리 챌린지 3주차 - 퍼즐 조각 채우기 (0) | 2021.08.22 |
[Programmers 문제 풀이] 자물쇠와 열쇠 (0) | 2021.08.09 |
[Programmers 문제 풀이] 기지국 설치 (0) | 2021.08.09 |