Study/Algorithm
프로그래머스 (C/C++) 258712 : 가장 많이 받은 선물
hwooo
2024. 6. 14. 17:07
https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr





풀이
선물을 주고 받은 기록을 2차원 배열으로 만들어 두고, 선물 지수도 같이 계산했다.
서로의 기록과 선물 지수를 비교하며 가장 많이 받은 사람의 수를 계산했다.
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<string> friends, vector<string> gifts) {
int maxPresentCnt = 0;
int log[50][50] = {0, }, giveCnt[50] = {0, }, receiveCnt[50] = {0, };
int size = gifts.size();
for (int i = 0; i < size; i++) {
string now = gifts[i];
int blankIdx = now.find(' ');
string giver = now.substr(0, blankIdx), receiver = now.substr(blankIdx + 1);
int giverIdx = find(friends.begin(), friends.end(), giver) - friends.begin();
int receiverIdx = find(friends.begin(), friends.end(), receiver) - friends.begin();
// 서로 선물을 주고 받은 기록을 표로 옮김
log[giverIdx][receiverIdx]++;
// 선물 지수 계산
giveCnt[giverIdx]++;
giveCnt[receiverIdx]--;
}
int people = friends.size();
for (int i = 0; i < people; i++) {
for (int j = 0; j < people; j++) {
if (i == j) continue;
// 선물을 주고 받음 & 주고 받은 횟수가 다름
if (log[i][j] || log[j][i]) {
if (log[i][j] > log[j][i])
receiveCnt[i]++;
// 선물을 주고 받은 횟수가 같음 & 선물 지수 비교
else if (log[i][j] == log[j][i] && giveCnt[i] > giveCnt[j])
receiveCnt[i]++;
}
// 선물을 주고 받지 않음
else {
// 서로의 선물 지수가 다름
if (giveCnt[i] > giveCnt[j])
receiveCnt[i]++;
}
}
maxPresentCnt = max(maxPresentCnt, receiveCnt[i]);
}
return maxPresentCnt;
}