반응형
문제 주소
https://school.programmers.co.kr/learn/courses/30/lessons/258712
풀이
조건을 잘 나누기만 하면 되는 문제였다.
쉬워서 풀이라고 할 만 한 게 없음.
코드
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int solution(vector<string> friends, vector<string> gifts) {
int answer = 0;
unordered_map<string, int> m;
for (int i = 0; i < friends.size(); i++){
m[friends[i]] = i;
}
// v1[준 사람][받은 사람]
vector<vector<int>> v1(friends.size(), vector<int>(friends.size(), 0));
// [이름] [0]:준 선물 [1]:받은 선물 [2]:선물 지수 [3]:받을 선물
vector<vector<int>> v2(friends.size(), vector<int>(4, 0));
for (auto g : gifts){
string s1 = "";
string s2 = "";
bool flag = true;
for (auto c : g){
if (c == ' '){
flag = false;
continue;
}
if (flag) s1 += c;
else s2 += c;
}
v1[m[s1]][m[s2]]++;
v2[m[s1]][0]++;
v2[m[s2]][1]++;
}
// 선물 지수 갱신
for (int i = 0; i < v2.size(); i++){
v2[i][2] = v2[i][0] - v2[i][1];
}
// 받을 선물 계산
for (int i = 0; i < friends.size(); i++){
for (int j = i + 1; j < friends.size(); j++){
if (i == j) continue;
if ((v1[i][j] == 0 && v1[j][i] == 0) || (v1[i][j] == v1[j][i])){
if (v2[i][2] > v2[j][2]) v2[i][3]++;
else if (v2[i][2] < v2[j][2]) v2[j][3]++;
}
else{
if (v1[i][j] > v1[j][i]){
v2[i][3]++;
}
else{
v2[j][3]++;
}
}
}
}
for (auto e : v2){
if (e[3] > answer) answer = e[3];
}
return answer;
}
반응형