프로그래머스

매출 하락 최소화 C++

paysmile 2021. 8. 9. 23:15

https://programmers.co.kr/learn/courses/30/lessons/72416

 

코딩테스트 연습 - 매출 하락 최소화

CEO를 포함하여 모든 직원은 팀장 또는 팀원이라는 직위를 가지고 있으며 그림에서는 팀장과 팀원의 관계를 화살표로 표시하고 있습니다. 화살표가 시작되는 쪽의 직원은 팀장, 화살표를 받는

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;
const int MAX = 300001;
int sale[MAX];
int v[MAX][2];
vector<int> team[MAX];

void FindMinValue(int turn){
    v[turn][0] = 0;
    v[turn][1] = sale[turn];
    int minvalue = 987654321;
    
    if(team[turn].size() == 0)
        return;
    
    for(int i=0; i<team[turn].size(); i++){
        FindMinValue(team[turn][i]);
        if(v[team[turn][i]][0] < v[team[turn][i]][1] ){
            v[turn][0] += v[team[turn][i]][0];
            v[turn][1] += v[team[turn][i]][0];
            minvalue = min(minvalue,v[team[turn][i]][1]-v[team[turn][i]][0]);
        }
        else{
            v[turn][0] += v[team[turn][i]][1];
            v[turn][1] += v[team[turn][i]][1];
            minvalue = 0;
        }
    }
    v[turn][0] += minvalue;
}

int solution(vector<int> sales, vector<vector<int>> links) {
    for(int i=0; i<sales.size(); i++){
        sale[i] = sales[i];
    }
    
    for(int i=0; i<links.size(); i++){
        team[links[i][0]-1].push_back(links[i][1]-1);
    }
    
    FindMinValue(0);
    return min(v[0][0],v[0][1]);
}