꾸물꾸물 졔의 개발공부

[프로그래머스] 이모티콘 할인행사 - JAVA (2023 KAKAO BLIND RECRUITMENT) 본문

알고리즘/프로그래머스

[프로그래머스] 이모티콘 할인행사 - JAVA (2023 KAKAO BLIND RECRUITMENT)

체제 2023. 9. 4. 16:30

https://school.programmers.co.kr/learn/courses/30/lessons/150368

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

이모티콘 최대갯수가 7개이므로 모든 할인율의 경우에 수에 대해 완전탐색으로 구현하였다. 

 

각 이모티콘의 할인율에 대한 가격을 int[][] sales 배열에 저장해두었는데, 할인금액을 구하는 과정에서

(s는 할인율 {10,20,30,40} )

sales[i][j] = (int)((double)emo * (1.0 - (s/100.0)));

을 했더니 85점을 받았다. 

 

sales[i][j]= (emo * (100-s)) / 100;

다음과 같이 바꾸었더니 100점이 나왔는데 잘 모르겠다,, (emoticons 원소는 100배수라고 했는데 왜 ..?)  

 

 

아무튼 다른 부분은 (조금 복잡한) 구현으로 해결 할 수 있다! 

 


 

class Solution {
    private int[] sale = {10,20,30,40}; 
    private int[][] sales; // 이모티콘의 할인율 별 가격 
    private int[] select; 
    int[] answer = {0,0};
    public int[] solution(int[][] users, int[] emoticons) {
        sales = new int[emoticons.length][4]; // 10,20,30,40%

        for(int i=0; i<emoticons.length; i++){
            int emo = emoticons[i]; //이모티콘의 가격 
            for(int j=0,s=10; j<4; j++, s+=10){
                sales[i][j]= (emo * (100-s)) / 100; 
                //sales[i][j] = (int)((double)emo * (1.0 - (s/100.0))); 

            }
        }
        select= new int[emoticons.length];     
        findAll(0, emoticons.length,users); 
        return answer;
    }
    //이모티콘별 할인율 가능한 모든 경우 찾기 
    private void findAll(int cnt, int len, int[][] users){
        if(cnt==len){
            findBest(select,users);  
            return; 
        }
        for(int i=0; i<4; i++){
            select[cnt] = sale[i]; 
            findAll(cnt+1,len,users); 
        }
    }
    //select: 각 이모티콘 별 할인율을 담고 있는 배열
    private void findBest(int[] select, int[][]users){
        int[] users_sum = new int[users.length]; //각 사용자들의 구매 비용 
        int plus =0; 
        int all_amount =0; //총 가입금액 
        for(int i=0; i<users.length; i++){
            int discount = users[i][0];// 해당 비율이상의 이모티콘 모두 구매 
            int amount = users[i][1]; //해당 금액 넘으면 이모티콘 무제한으로 변경 
            
            for(int j=0; j<select.length; j++){
                int sale_sel = select[j]; //j번째 이모티콘의 할인율 
                if(sale_sel >= discount) {
                    users_sum[i] += sales[j][(sale_sel/10)-1] ; //몇번째 이모티콘의 얼만큼 할인율의 가격 더하기 
                }
            }
            
            if(users_sum[i] >= amount) plus++; //이모티콘 플러스 가입 
            else all_amount += users_sum[i]; 
            
            if(answer[0] < plus) {
                answer[0] = plus;
                answer[1] = all_amount; 
            }
            else if(answer[0] == plus) {
                answer[1] = Math.max(answer[1], all_amount); 
            }
            
        }    
    }
}