알고리즘 문제풀이/프로그래머스

[프로그래머스/Level 1] 가장 많이 받은 선물

노력의천재 2024. 1. 7. 20:06

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

카카오 기출

 

'선물을 주고 받은 기록이 없는 경우'가 "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);
}