import java.util.*;
class Solution {
List<Person> personList = new ArrayList<>();
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
// 1. 계층 관계 객체 생성
for (int i = 0; i < enroll.length; i++) {
String name = enroll[i];
String referralName = referral[i];
Person person = new Person();
person.name = name;
if (!referralName.equals("-")) {
person.parentName = referralName;
}
personList.add(person);
}
// 2. 판매 금액 보면서 금액 배분
for (int i = 0; i < seller.length; i++) {
String sellerName = seller[i];
int sellMoney = amount[i] * 100;
Person target = personList
.stream()
// seller[i] 사용 불가 : i가 effective final이 아님
.filter(person -> person.name.equals(sellerName))
.findFirst().get();
// 1~100 개 팔았으니 일단 무조건 90퍼로 먹고들어감
target.money += (int)(sellMoney * 0.9);
// 부모가 있으면 10퍼 넘기기, 만약 없는 녀석들이라면 그냥 본사에 헌납한 것으로 고려 x
if (target.parentName != null) {
tenPercent(target.parentName, (int)(sellMoney * 0.1));
}
}
// 3. 결과 반환
int[] resultArr = new int[enroll.length];
for (int i = 0; i < enroll.length; i++) {
String target = enroll[i];
resultArr[i] = personList.stream()
.filter(p -> p.name.equals(target))
.findFirst().get().money;
}
return resultArr;
}
private void tenPercent(String parentName, int incentive) {
// 1. 부모 찾기
Person parent = personList.stream()
.filter(p -> p.name.equals(parentName))
.findFirst().orElse(null);
// 2. 90% 먹고
int nextParentParent = (int) (incentive * 0.1);
parent.money += incentive;
// 3-1. 부모의 부모에게 다시 대상금 넘길 수 있다면 10% 뺏기
if (nextParentParent > 0) {
parent.money -= nextParentParent;
}
// 3-2. 부모가 있으면서 계속 분배금 분배 가능하면 재귀 호출
if (parent.parentName != null) {
tenPercent(parent.parentName, nextParentParent);
}
}
}
class Person {
String name;
int money;
String parentName;
}
import java.util.*;
class Solution {
List<Person> personList = new ArrayList<>();
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
// 1. 계층 관계 객체 생성
for (int i = 0; i < enroll.length; i++) {
String name = enroll[i];
String referralName = referral[i];
Person person = new Person();
person.name = name;
if (!referralName.equals("-")) {
person.parentName = referralName;
}
personList.add(person);
}
// 2. 판매 금액 보면서 금액 배분
for (int i = 0; i < seller.length; i++) {
String sellerName = seller[i];
int sellMoney = amount[i] * 100;
Person target = personList
.stream()
// seller[i] 사용 불가 : i가 effective final이 아님
.filter(person -> person.name.equals(sellerName))
.findFirst().get();
// 1~100 개 팔았으니 일단 무조건 90퍼로 먹고들어감
target.money += (int)(sellMoney * 0.9);
// 부모가 있으면 10퍼 넘기기, 만약 없는 녀석들이라면 그냥 본사에 헌납한 것으로 고려 x
if (target.parentName != null) {
tenPercent(target.parentName, (int)(sellMoney * 0.1));
}
}
// 3. 결과 반환
int[] resultArr = new int[enroll.length];
for (int i = 0; i < enroll.length; i++) {
String target = enroll[i];
resultArr[i] = personList.stream()
.filter(p -> p.name.equals(target))
.findFirst().get().money;
}
return resultArr;
}
private void tenPercent(String parentName, int incentive) {
while (true) {
String target = parentName;
// 1. 부모 찾기
Person parent = personList.stream()
// parentName 사용 불가 : 참조가 계속 변하기에 effective final이 아님
.filter(p -> p.name.equals(target))
.findFirst().orElse(null);
// 2. 90% 먹고
int nextParentParent = (int)(incentive * 0.1);
parent.money += (incentive - nextParentParent);
// 3-1. 만약 1원 미만의 돈을 상위에 넘기는 셈이라면 종료시키기
// 부모가 없으면 -> 자기가 마지막이니 만약 넘길 돈이 있어도 그냥 센터에만 주면되니 그냥 함수 끝
if (nextParentParent == 0 || parent.parentName == null) {
break;
}
// 3-2. 부모가 있으면서 계속 분배금 분배 가능하면 재귀 호출(값 갱신)
parentName = parent.parentName;
incentive = nextParentParent;
}
}
}
class Person {
String name;
int money;
String parentName;
}
import java.util.*;
class Solution {
Map<String, Person> personMap = new HashMap<>();
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
// 1. 계층 관계 객체 생성
for (int i = 0; i < enroll.length; i++) {
String name = enroll[i];
String referralName = referral[i];
Person person = new Person();
person.name = name;
if (!referralName.equals("-")) {
person.parentName = referralName;
}
personMap.put(name, person);
}
// 2. 판매 금액 보면서 금액 배분
for (int i = 0; i < seller.length; i++) {
String sellerName = seller[i];
int sellMoney = amount[i] * 100;
Person target = personMap.get(sellerName);
// 1~100 개 팔았으니 일단 무조건 90퍼로 먹고들어감
target.money += (int)(sellMoney * 0.9);
// 부모가 있으면 10퍼 넘기기, 만약 없는 녀석들이라면 그냥 본사에 헌납한 것으로 고려 x
if (target.parentName != null) {
tenPercent(target.parentName, (int)(sellMoney * 0.1));
}
}
// 3. 결과 반환
int[] resultArr = new int[enroll.length];
for (int i = 0; i < enroll.length; i++) {
resultArr[i] = personMap.get(enroll[i]).money;
}
return resultArr;
}
private void tenPercent(String parentName, int incentive) {
while (true) {
// 1. 부모 찾기
Person parent = personMap.get(parentName);
// 2. 90% 먹고
int nextParentParent = (int)(incentive * 0.1);
parent.money += (incentive - nextParentParent);
// 3-1. 만약 1원 미만의 돈을 상위에 넘기는 셈이라면 종료시키기
// 부모가 없으면 -> 자기가 마지막이니 만약 넘길 돈이 있어도 그냥 센터에만 주면되니 그냥 함수 끝
if (nextParentParent == 0 || parent.parentName == null) {
break;
}
// 3-2. 부모가 있으면서 계속 분배금 분배 가능하면 재귀 호출(값 갱신)
parentName = parent.parentName;
incentive = nextParentParent;
}
}
}
class Person {
String name;
int money;
String parentName;
}
12 원을 edward 로부터 받은 mary 는 10% 인 1 원을 센터에 (즉, 민호에게) 배분하고 자신은 나머지인 11 원을 가집니다.
- 12원이 넘어왔을 때 90%를 계산 -> 10.8원 -> 소수점 절삭 -> 10원
- 실제로는 11원으로 계산해야 함 -> 10%를 구해서 빼주는 것이 소수점 연산 안전
for (int i = 0; i < seller.length; i++) {
int sellMoney = amount[i] * 100;
Person target = personList
.stream()
// 람다 외부에서 선언한 지역변수 i가 effective final이 아니기 때문에 불가
.filter(person -> person.name.equals(seller[i]))
.findFirst().get();
private void tenPercent(String parentName, int incentive) {
List<Person> sample = new ArrayList<>();
while (true) {
String target = parentName;
// 1. 부모 찾기
Person parent = sample.stream()
// parentName의 참조가 계속 변경됨
// effective final이 아니기 때문에 매번 target 지역변수 초기화
.filter(p -> p.name.equals(parentName))
.findFirst().orElse(null);
....
parentName = parent.parentName;
incentive = nextParentParent;
}
}
local variables referenced from a lambda expression must be final or effectively final
IntStream.range(0, seller.length).forEach(i -> {
Person target = personList.stream()
// i는 람다 내부에서 선언한 변수라 effective final 아니여도 됨
.filter(person -> person.name.equals(seller[i])) // seller[i]를 사용
.findFirst()
.orElse(null);
});