import java.util.*;
class Solution {
private int[][] USERS;
private int[] EMOTICONS;
private int[] discount = new int[]{10,20,30,40};
private int profitMax,plusMax;
public int[] solution(int[][] users, int[] emoticons) {
USERS = users;
EMOTICONS = emoticons;
for(int el : discount){
dfs(0,0,0,el,new int[users.length]);
}
int[] answer = new int[]{plusMax,profitMax};
return answer;
}
public void dfs(int curIdx, int profit, int plus, int discountRate, int[] userState){
if(curIdx == EMOTICONS.length){
if(plus >plusMax){
plusMax = plus;
profitMax = profit;
}else if(plus == plusMax){
profitMax = Math.max(profitMax,profit);
}
return; // 여기서 return 문으로 끊어 주지 않고 if, else-if문에서끊어 주면 나머지 case에 대해서 종료가 안되어 스택오버 플로우 발생
}
for(int i=0; i<userState.length; i++){
int curUser = userState[i];
if(curUser == -1) continue;
int upperBound = USERS[i][1];
int minDiscountRate = USERS[i][0];
if(minDiscountRate<= discountRate){
double discountPrice = (double) EMOTICONS[curIdx]*(100-discountRate)/100;
if((curUser + discountPrice) < upperBound){
userState[i] += discountPrice;
profit+=discountPrice;
}else{
userState[i] = -1;
plus++;
profit -= curUser;
}
}
}
for(int el : discount){
// 새로운 유저 상태 복사본 배열을 넘겨주지 않으면 첫번째 dfs라인의 userState에서 갱신되지 않는다.
dfs(curIdx+1,profit,plus,el,Arrays.copyOf(userState,userState.length));
}
}
}
함수 인자로 참조형 자료 넘겨줄지, 복사하여 넘겨줄지 결정
dfs(curIdx+1,profit,plus,el,Arrays.copyOf(userState,userState.length));
Arrays.copyOf(targetArray,num) -> num 인덱스 까지 타깃 어레이 복사
Arrays.copyOfRange(targetArray,startIdx,endIdx)
둘다 필드명으로 접근한다