티스토리 뷰

반응형

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

 

코딩테스트 연습 - 다단계 칫솔 판매

민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,

programmers.co.kr


⊙ 문제

⊙ 제한사항

⊙ 입출력 예

⊙ 입출력 예 설명


 

⊙ 문제 접근 과정

 

map을 사용하여 문제를 풀었다.

이익에 대해 계산해주는 재귀 함수를 따로 만들어주어 판 사람의 수만큼 반복해준다.

 

자세한 설명은 코드 줄마다 전부 주석을 달아놨으니 참고하면 될 것 같다!


 

⊙ 문제 풀이

 

#include <iostream>
#include <vector>
#include <map>

using namespace std;
#define MAX 10001

map<string,int> m;
int parent[MAX];
int profits[MAX];

void divideProfit(int indx, int profit) {
    if(indx == -1) return; //최상위 포식자면 종료

    int stolen = profit/10; //10%를 상위 포식자에게 준다
    profits[indx] += profit - stolen; //내 이익

    if(!stolen) return; //줄 profit이 없다면 stop

    divideProfit(parent[indx], stolen); //재귀
}

vector<int> solution(vector<string> enroll, vector<string> referral, vector<string> seller, vector<int> amount) {
    vector<int> answer;

    for (int i = 0; i < enroll.size(); i++)
        m[enroll[i]] = i; //name, index 저장

    for (int i = 0; i < referral.size(); i++) {
        if (referral[i] == "-") parent[i] = -1; //최상위 포식자
        else parent[i] = m[referral[i]]; //상위 포식자 저장
    }
 
    for (int i = 0; i < seller.size(); i++)
        divideProfit(m[seller[i]], amount[i] * 100); // 이익 계산(칫솔 개당 100원)
 
    for (int i = 0; i < enroll.size(); i++)
        answer.push_back(profits[i]); //결과
 
    return answer;
}

⊙ 마무리

 

 

NONE

 

좋아요 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함