Problem Solving
[프로그래머스] 다단계 칫솔 판매 (JAVA)
흑개1
2022. 1. 23. 00:30
https://programmers.co.kr/learn/courses/30/lessons/77486
코딩테스트 연습 - 다단계 칫솔 판매
민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,
programmers.co.kr
import java.util.*;
class Solution {
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
int[] answer = new int[enroll.length];
String refer;
int price, sum;
Map<String,String> m=new HashMap<>();
Map<String, Integer> ans=new HashMap<>();
for (int i=0; i<enroll.length; i++){
m.put(enroll[i], referral[i]);
}
for (int i=0; i<seller.length; i++){
refer=seller[i];
price=amount[i]*100;
while (!refer.equals("-")){
sum=ans.containsKey(refer)?ans.get(refer):0;
if (price<10){
ans.put(refer,sum+price);
break;
}
else{
ans.put(refer, sum+(price-(price*1/10)));
price/=10;
}
refer=m.get(refer);
}
}
for (int i=0; i<enroll.length; i++){
if (ans.containsKey(enroll[i])){
answer[i]=ans.get(enroll[i]);
}
}
return answer;
}
}
map을 2개 써서, 각 member와 그 referer을 연결해줘서 "-"를 만날 때까지 계속 반복문을 돌려주는 식으로 했다.
referer을 찾는 map과, 결과를 저장하는 map을 만들었다. 최종적으로 결과 저장하는 map을 돌아서 answer 배열을 완성하는 식으로 했다.
다른 분들의 코드를 보니, 조금 더 가독성좋게 소개인에게 남겨줄 금액을 뺀 것을 자기 금액으로 취하고, 노드를 이동하면서, price/=10 해주는 방법이 있었다.
또한 결과를 저장하는 map 을 만드는 대신, 대신 answer 배열의 인덱스 값과 enroll에 담긴 이름을 매칭시키는 map을 만들어서, answer 배열에 바로 넣을 수 있었다. answer[memberIndex.get(now)]+=price 와 같은 형태로!
그러면 map에 넣을때 key 있는지 검사할 필요도 없다.