알고리즘 문제풀이/프로그래머스
[프로그래머스/Level 1] 가장 많이 받은 선물
노력의천재
2024. 1. 7. 20:06
https://school.programmers.co.kr/learn/courses/30/lessons/258712
카카오 기출
'선물을 주고 받은 기록이 없는 경우'가 "A -> B 1개", "B -> A 0개"도 포함된다고 이해 하였는데, 말 그대로 서로 0개 주고 받은 경우를 의미한다. (조건을 잘 못 이해해서 시간 많이 잡아먹음)
조건을 꼼꼼하게 잘 읽어보면 어렵지 않게 구현할 수 있을듯
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
int check[51][51];
int solution(vector<string> friends, vector<string> gifts) {
int answer = -2147000000;
unordered_map<string, int> um, giveUm, receiveUm, giftUm;
// 선물을 주고 받은 횟수 저장
for (auto &gift : gifts) {
um[gift]++;
}
// 추후 선물 지수 계산을 위해 이름별로 선물을 준 횟수와 선물을 받은 횟수를 각각 저장
for (auto &it : um) {
string from, to;
stringstream ss(it.first);
int cnt = it.second;
getline(ss, from, ' ');
getline(ss, to, ' ');
giveUm[from] += cnt;
receiveUm[to] += cnt;
}
for (int i = 0; i < friends.size(); i++) {
for (int j = 0; j < friends.size(); j++) {
if (i == j || check[i][j] == 1) continue;
int fromToCnt = um[friends[i] + " " + friends[j]];
int toFromCnt = um[friends[j] + " " + friends[i]];
if (fromToCnt > toFromCnt) {
giftUm[friends[i]]++;
check[i][j] = 1;
} else if (fromToCnt == toFromCnt) {
int fromIndex = giveUm[friends[i]] - receiveUm[friends[i]];
int toIndex = giveUm[friends[j]] - receiveUm[friends[j]];
if (fromIndex > toIndex) giftUm[friends[i]]++;
else if (fromIndex < toIndex) giftUm[friends[j]]++;
check[i][j] = 1;
check[j][i] = 1;
}
}
}
// 최대값 구하기
for (auto &it : giftUm) {
answer = max(answer, it.second);
}
return max(answer, 0);
}