문제에 또 집착을 해버려서.시간이 얼마나 날아간거지
트리구조 → parent(추천인)가 존재함.
예시를 보았는데 1200 → 120 배분 → 12 배분 → 1 배분 (1.2니까)
이런 경우가 생겨서..
처음에는 언뜻 Union find인가.. 했는데 생각해보니 그냥 바로 위의 parent만 사용해도 될 것 같았다.
일단, 사람의 이름이 주어지기 때문에 무조건 hash 자료구조를 사용할 것이다.
→ [ 사람 : 부모 ] 맵
→ [ 사람 : 금액 ] 맵
seller의 길이는 10만 이하다.
referral의 길이는 1만 이하다 → 10000 x 100000 은.... 안되겠군.
.... 오늘 또 문제에 좀 집착하고 있다..하루종일 이것만 풀었네.. 이러지 않기로 했는데 그게 잘 안되는듯하다;
import java.util.*;
class Solution {
public Map<String,String> parentMap = new HashMap<>();
public Map<String,Integer> tot = new HashMap<>(); // 결과 금액
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
int[] answer = {};
int cur = 0 , rest = 0;
String parent = null,child = null;
// set child - parent Map
for(int i = 0; i< enroll.length;i++){
parentMap.put(enroll[i],referral[i]);
// getOrDefault를 하지 않기 위해 먼저 0으로 세팅
tot.put(enroll[i],0);
}
// seller 을 돌면서 dfs 식으로 쭉쭉 올라간다
for(int i =0; i < seller.length; i++){
cur = 100 * amount[i]; // 이만큼 판매함
// System.out.println("현재 판매 가격 "+ cur);
child = seller[i];
// 이제 쭉쭉 타고 올라가야함
while(!child.equals("-")){
rest = cur/10;
tot.put(child,tot.get(child) + cur-rest);
cur = rest;
child = parentMap.get(child);
if(cur < 1) break;
}
}
// 정답 세팅
answer = new int[enroll.length];
for(int i=0;i<enroll.length;i++){
answer[i] = tot.get(enroll[i]);
// System.out.println(answer[i]);
}
return answer;
}
}
1보다 작은지 확인하는것보다
0과 같은지 확인하는게 훨씬 효율적일듯하다