다단계 칫솔 판매
2024-08-12
#JAVA#프로그래머스
문제 풀이 시간 : 30분
문제 요약
- •
트리의 형태로 다단계 판매가 형성되어 있다.
- •
각 판매원은 자신에게 발생하는 이익의 10%를 추천인에게 배분하고 나머지를 가진다.
- •
각 판매원의 이익을 계산하라.
문제 풀이
해당 문제는 2021 백엔드 개발자를 위한 코테 문제였다.
호기롭게 레벨3 문제를 풀어보자 하고 문제를 읽었는데 생각보다 너무 쉬워보여서
내가 모르는 뭔가가 있나? 하고 일단 풀어보았다.
나는 그냥 문제에서 시키는대로 각 판매원이 판매하고 얻은 이익의 10%를 부모에게 전달하는 재귀형식으로 풀었다.
코드
import java.util.*;
class Solution {
public int[] money;
public Map<String,String> parent;
public Map<String,Integer> num;
public void sell(String seller, int result){
if(seller.equals("-") || result < 1){ //부모가 없거나, 남은 돈이 없는 경우 리턴
return;
}
int rest = result / 10; //부모에게 줄 돈
result -= rest;
money[num.get(seller)] += result; //남은돈 저장
sell(parent.get(seller), rest); //부모에게 10% 주기
}
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
int[] answer = {};
parent = new HashMap<>();
num = new HashMap<>();
money = new int[enroll.length];
for(int i=0;i<enroll.length;i++){
parent.put(enroll[i],referral[i]);
num.put(enroll[i],i);
}
for(int i=0;i<seller.length;i++){
sell(seller[i],amount[i]*100);
}
return money;
}
}
위와 같은 코드로 너무 쉽게 풀 수 있었다.
그렇다면 다른 전문가들의 풀이는 어떨까?
import java.util.HashMap;
import java.util.Map;
class Solution {
Map<String, String> parent = new HashMap<>();
Map<String, Integer> money = new HashMap<>();
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
for (int i = 0; i < enroll.length; i++) {
parent.put(enroll[i], referral[i]);
}
for (int i = 0; i < seller.length; i++) {
share(seller[i], amount[i] * 100);
}
int[] result = new int[enroll.length];
for (int i = 0; i < enroll.length; i++) {
result[i] = money.getOrDefault(enroll[i], 0);
}
return result;
}
void share(String node, int sales) {
int nextSales = sales / 10;
money.put(node, money.getOrDefault(node, 0) + sales - nextSales);
if (nextSales > 0 && parent.containsKey(node)) {
share(parent.get(node), nextSales);
}
}
}
코드가 더 깔끔한 것 같기는 하다.
하지만 로직에 큰 차이는 없는 것 같다.
이 문제는 왜 레벨3으로 표시되어있는지 잘 모르겠다