문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/258712
풀이
친구의 이름이 담긴 friends 벡터와 누가 누구에게 선물을 준 기록인 gifts 벡터가 주어진다.
3가지 단계를 거쳐 문제를 해결했다.
1. 입출력 예시와 같이 주고받은 선물 표를 구한다.
2. 선물 지수 표를 구한다.
3. 두 표를 사용해서 각 사람마다 받아야 하는 선물 개수를 계산해 최댓값을 구한다.
주고받은 선물 표는 아래와 같이 2차원 벡터로 만든다.
// 2차원 벡터 생성(presentTable)
int friend_size = friends.size(), gift_size = gifts.size();
vector<vector<int>> presentTable(friend_size, vector<int>(friend_size, 0));
string givef, getf;
for(int i = 0; i < gift_size; i++){
// 선물을 준 사람과 받은 사람의 이름을 구한다.
givef = gifts[i].substr(0, gifts[i].find(' '));
getf = gifts[i].substr(gifts[i].find(' ')+1, gifts[i].length());
// friends 벡터에서 각 이름이 몇번째인지 찾아 횟수를 기록한다.
presentTable[find(friends.begin(), friends.end(), givef) - friends.begin()][find(friends.begin(), friends.end(), getf) - friends.begin()]++;
}
선물 지수 표는 (준 선물) - (받은 선물)을 계산하여 벡터로 만든다.
vector<int> presentN(friend_size);
int givep, getp;
for(int i = 0; i < friend_size; i++){
givep = 0;
getp = 0;
// 준 선물의 개수
for(int j : presentTable[i]){
givep += j;
}
// 받은 선물의 개수
for(int j = 0; j < friend_size; j++){
getp += presentTable[j][i];
}
presentN[i] = givep - getp;
}
presentTable 벡터를 사용해서 각 사람마다 선물을 받은 것보다 줬을 때가 더 많은 경우를 전부 찾습니다. 받은 것과 준 것의 횟수가 같은 경우에는 선물 지수를 고려하여 선물 개수를 계산합니다.
int total;
for(int i = 0; i < friend_size; i++){
total = 0;
// 각 사람마다 선물을 받게 되는 경우 계산
for(int j = 0; j < friend_size; j++){
if((presentTable[i][j] > presentTable[j][i])
|| ((presentTable[i][j] == presentTable[j][i])
&& (presentN[i] > presentN[j]))){
total++;
}
}
// 가장 많이 받는 경우를 찾는다
if(total > answer) answer = total;
}
최종 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<string> friends, vector<string> gifts) {
int answer = 0;
int friend_size = friends.size();
int gift_size = gifts.size();
vector<vector<int>> presentTable(friend_size, vector<int>(friend_size, 0));
vector<int> presentN(friend_size);
string givef, getf;
for(int i = 0; i < gift_size; i++){
givef = gifts[i].substr(0, gifts[i].find(' '));
getf = gifts[i].substr(gifts[i].find(' ')+1, gifts[i].length());
presentTable[find(friends.begin(), friends.end(), givef) - friends.begin()][find(friends.begin(), friends.end(), getf) - friends.begin()]++;
}
int givep, getp;
for(int i = 0; i < friend_size; i++){
givep = 0;
getp = 0;
for(int j : presentTable[i]){
givep += j;
}
for(int j = 0; j < friend_size; j++){
getp += presentTable[j][i];
}
presentN[i] = givep - getp;
}
int total;
for(int i = 0; i < friend_size; i++){
total = 0;
for(int j = 0; j < friend_size; j++){
if((presentTable[i][j] > presentTable[j][i])
|| ((presentTable[i][j] == presentTable[j][i])
&& (presentN[i] > presentN[j]))){
total++;
}
else{
}
}
if(total > answer) answer = total;
}
return answer;
}'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| 코딩 기초 트레이닝 완 (4) | 2025.07.21 |
|---|---|
| [프로그래머스/C++] [PCCE 기출문제] 10번/데이터 분석 (0) | 2024.04.01 |