주녘공부일지

[프로그래머스 C#] Lv.3 다단계 칫솔 판매 본문

Programmers - C#/CodingTest Lv.3

[프로그래머스 C#] Lv.3 다단계 칫솔 판매

주녘 2024. 1. 25. 15:51
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

트리 형태처럼 이루어진 다단계 피라미드에서 각 멤버의 수익을 측정해 반환하는 문제

 

1) 수익금이 발생했을 경우 수익을 내거나 받은 나는 무조건 수익의 90%만 수익으로 측정

- 추천인이 없더라도 센터에게 분배해야 되기 때문에 무조건 90%만 가질 수 있음

 

2) seller에는 같은 이름이 중복해서 들어있을 수 있음 (주의!)

- 얼핏 봤을 때 트리구조이기에 수익금을 각 트리에 세팅하고 최하위 자식 노드부터 최상위 부모 노드의 방향으로 한번에 연산하면 될 거라고 생각할 수 있지만, 같은 이름이 중복해서 들어있을 수 있으므로,

 -> 발생한 수익을 하나씩 처리해주어야 함

 예외상황 ex) 25원 -> 2원을 배분, 50원 -> 5원을 배분

 

주석 참조

using System;
using System.Collections.Generic;

public class Solution
{
    public int[] solution(string[] enroll, string[] referral, string[] seller, int[] amount)
    {
        int[] answer = new int[enroll.Length]; // 수익 현황 배열
        var intArray = new int[enroll.Length]; // 나(index)의 추천인(value) 배열, 없으면 -1
        var dict = new Dictionary<string, int>(); // 이름사전 <이름, 인덱스>
        
        // 이름사전, 추천인 배열 세팅
        dict.Add("-", -1);
        for(int i = 0; i < enroll.Length; i++)
        {
            dict.Add(enroll[i], i);
            intArray[i] = dict[referral[i]];
        }
        
        // 수익이 발생한 것 하나씩 처리
        for(int i = 0; i < seller.Length; i++)
        {
            int currIndex = dict[seller[i]]; // 나의 인덱스
            int money = amount[i] * 100; // 수익금
            
            while(true)
            {
                // 배분할 수익금과 나의 수익 추가
                int subMoney = (int)Math.Floor(money * 0.1f);
                answer[currIndex] += money - subMoney;
                
                // 배분할 대상이 없거나 배분할 수익금이 없을 경우 중단
                if(subMoney == 0 || intArray[currIndex] == -1)
                    break;
                
                // 배분 수익금과 배분 대상 세팅
                currIndex = intArray[currIndex]; 
                money = subMoney;
            }
        }
        
        return answer;
    }
}
728x90