Programmers_다단계 칫솔 판매

한상현·2021년 7월 15일
0

Algorithm

목록 보기
31/33

😄 3단계는 역시 어렵고 재밌다

  • 처음엔 트리 문제인가 싶었다. (그림이 트리처럼 되어있어서)
  • 근데 문제를 잘 읽어보니 자신부터 부모까지 재귀를 돌며 돈을 나눠가지는 형식의 문제였다.
  • string이며 자신의 부모를 저장하기 위해서 map을 써야겠다고 생각했다.
  • map<string,int> : 자신이 가지고 있는 돈
  • map<string,string> : 자신의 부모
    m["-"] = 0;
    for(int i=0;i<enroll.size();i++)
    {
        m[enroll[i]]=0;
        parent[enroll[i]] = referral[i];
    }
  • center는 출력할 필요가 없다는걸 모르고, 계속 출력했었다.
  • 자신의 돈은 0으로 초기화시켜주고 parent도 초기화시켜줬다.(enroll, referral 벡터를 사용해서)
    for(int i=0;i<seller.size();i++)
    {
        string me = seller[i];
        int coin = amount[i]*100;
        while(me !="-" && coin/10 >= 1 )
        {
            m[me] += (coin - coin/10);
            coin = coin/10;
            me = parent[me];
        }
        m[me] += (coin);
    }
  • 나머지가 1원 미만인 경우와 내가 가장 최상위 계층이면 while문을 빠져나온다.
  • 빠져나온경우에는 저장하지 못하기 때문에 저장도 필수
  • 근데 문제를 다 풀고 보니 다른 사람들은 coin/10 >= 1에 대한 조건을 달아주지 않았다.
  • 왜일까? 생각해보니 어차피 0원이면 부모로 계속올라가며 0원을 더해도 똑같기 때문인거같다.
  • 필자는 1원 미만이면 굳이 부모까지 올라가지 않기위해 조건을 달아줬다면 다른분은 어차피 트리기에 부모까지의 올라가는 수가 많지 않다고 판단했고 그냥 올라가게 냅둔것 같다.
💻전체 코드
#include <string>
#include <vector>
#include <unordered_map>
#include <iostream>

using namespace std;

unordered_map<string,int>m;
unordered_map<string,string>parent;

vector<int> solution(vector<string> enroll, vector<string> referral, vector<string> seller, vector<int> amount) {
    vector<int> answer;
    
    m["-"] = 0;
    for(int i=0;i<enroll.size();i++)
    {
        m[enroll[i]]=0;
        parent[enroll[i]] = referral[i];
    }
    
    for(int i=0;i<seller.size();i++)
    {
        string me = seller[i];
        int coin = amount[i]*100;
        while(me !="-" && coin/10 >= 1 )
        {
            m[me] += (coin - coin/10);
            coin = coin/10;
            me = parent[me];
        }
        m[me] += (coin);
    }
    
    for(int i=0;i<enroll.size();i++)
    {
        answer.push_back(m[enroll[i]]);
    }
    
    return answer;
}
profile
의 공부 노트.

0개의 댓글