kakao blind test-2023 이모티콘 할인행사

이동한·2023년 6월 6일
0

알고리즘 기출

목록 보기
2/22
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)

static,instacne 필드 참조

둘다 필드명으로 접근한다

profile
Pragmatic, Productive, Positivist

0개의 댓글