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;
}