카테고리 없음

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

바토파 2024. 10. 11. 21:49
반응형

문제 주소

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

 

풀이

조건을 잘 나누기만 하면 되는 문제였다.

쉬워서 풀이라고 할 만 한 게 없음.

 

코드

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

int solution(vector<string> friends, vector<string> gifts) {
    int answer = 0;
    
    unordered_map<string, int> m;

    for (int i = 0; i < friends.size(); i++){
        m[friends[i]] = i;
    }
    
    // v1[준 사람][받은 사람]
    vector<vector<int>> v1(friends.size(), vector<int>(friends.size(), 0));
    
    // [이름]  [0]:준 선물 [1]:받은 선물 [2]:선물 지수 [3]:받을 선물
    vector<vector<int>> v2(friends.size(), vector<int>(4, 0));
    
    for (auto g : gifts){
        string s1 = "";
        string s2 = "";
        bool flag = true;
        for (auto c : g){
            if (c == ' '){
                flag = false;
                continue;
            }
            if (flag)  s1 += c;
            else  s2 += c;
        }
        
        v1[m[s1]][m[s2]]++;
        v2[m[s1]][0]++;
        v2[m[s2]][1]++;
    }
    
    // 선물 지수 갱신
    for (int i = 0; i < v2.size(); i++){
        v2[i][2] = v2[i][0] - v2[i][1];
    }
    
    // 받을 선물 계산
    for (int i = 0; i < friends.size(); i++){
        for (int j = i + 1; j < friends.size(); j++){
            if (i == j) continue;
            
            if ((v1[i][j] == 0 && v1[j][i] == 0) || (v1[i][j] == v1[j][i])){
                if (v2[i][2] > v2[j][2]) v2[i][3]++;
                else if (v2[i][2] < v2[j][2]) v2[j][3]++;
            }
            else{
                if (v1[i][j] > v1[j][i]){
                    v2[i][3]++;
                }
                else{
                    v2[j][3]++;
                }
            }
        }
    }
    
    for (auto e : v2){
        if (e[3] > answer) answer = e[3];
    }
    
    return answer;
}
반응형