[Kotiln] 프로그래머스 다단계 칫솔 판매

송규빈·2022년 5월 18일
0

📘 문제

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

💡 풀이

☑️ enroll과 referral을 각각 자식과 부모로 보자

  1. 자식이 여러 개인 부모가 있기 때문에, 자식을 key로 잡기
  2. seller가 중복될 수 있으니 index를 따로 저장해서 자신의 금액에 추가할 때 index로 맵핑하여 찾기
  3. 배당금은 이익금의 10%이지만, 1원 미만은 제외한다고 하였으니 소수점을 무시하는 Int형으로 계산하면 된다.
  4. seller 배열에 있는 인원들을 자식으로 볼 때, 그 자식의 부모1에게 배당금을 준 후 배당금을 받은 부모1의 부모2에게도 부모1이 받은 배당금의 10%를 줘야하고 이것이 반복되기에 while문으로 생각.
  5. 4번의 과정에서 base condition은 부모가 더이상 없는 "-"이거나 배당금이 1원 미만이라 더이상 줄 수가 없을 때도 정한다.

💻 코드

 fun solution(
    enroll: Array<String>,
    referral: Array<String>,
    seller: Array<String>,
    amount: IntArray
): IntArray {
    val answer = IntArray(enroll.size)
    // 자신의 이익금에서 /10을 배분하고 나머지를 자신이 가진다
    // 배분 금액 = 이익금 / 10
    // 가질 금액 = 이익금 - 배분 금액
    // amount 판매개수 , index는 seller와 같다.


    // 자식이 여러 개인 부모가 있기 때문에
    // 자식을 키로 잡고 각각 계산하기 <자식, 부모>
    val parentMap = HashMap<String, String>()
    // seller가 중복되어 나올 수 있으므로 index를 저장하여 이익금 계산할 때 위치 찾기
    val indexMap = HashMap<String, Int>()



    enroll.forEachIndexed { index, child ->
        val parent = referral[index]
        parentMap[child] = parent
        indexMap[child] = index
    }

    for (i in seller.indices) {
        var tmpSeller = seller[i]
        var profit = amount[i] * 100
        while (true) {
            if (tmpSeller == "-") break
            if (profit < 1) break
            val dividend = profit / 10
            val myProfit = profit - dividend
            // 자신의 금액 추가
            answer[indexMap[tmpSeller]!!] += myProfit

            // 현재의 부모가 받은 배당금의 10%를 또 그 위의 부모에게 전달
            tmpSeller = parentMap[tmpSeller]!!
            profit /= 10

        }
    }

    return answer
}

결과

profile
🚀 상상을 좋아하는 개발자

0개의 댓글