알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 이모티콘 할인행사

류창 2023. 1. 11. 18:19
반응형

 

문제분석

 

처음 문제를 접할때 복잡한 문제지만,  기본 로직을 잡고 천천히 풀다보면 쉽게 풀린다.

 

요점은, 전략을 잘짜는것이다.

 

제한사항이다. 

 

이모티콘의 할인율은 10 , 20 , 30, 40프로 4가지로 정해져있고, 이모티콘은 총 7개 제한이다.

 

유저는 100명이다.

 

 완전탐색으로 구한다면 100*4^7 효율성이 예상된다. 

 

 

 

완전탐색으로 풀기로 하였다.

 

완전탐색의 기준은  이모티콘이 할인되는 경우의수다. 

각각의 이모티콘이 10% ,20%, 30% ,40% 할인되는 분기를 모두 탐색할것이다.

 

최종적으로, sign으로 최대 회원수와  earn으로 최대 수익을 반환할것이다.

 

arr는 이모티콘들이 할인되는 퍼센트를 저장할 예정 이다.

comb() 메소드로 이모티콘할인되는 분기를 모두 탐색이 시작된다.

 

완전탐색 분기가 은근 간단하게나온다.

 

각 단계마다 4번 할인율를 입력하고 다음단계로 넘기는 로직이다.

만약, 이모티콘에게 모든 할인율을 적용했다면 그 이모티콘의 할인율이 책정된 상태로 

회원과 수익을 계산하는 calculate()로 이동하게된다.

 

caluculate 메소드다.

 

count는 해당 이모티콘할인율을 적용햇을때 회원수

earn_t는 해당 이모티콘 할인율을 적용했을때의 수익이다.

이 변수를 선언하는 이유는, 최종 회원수와 최종 수익을 매번 갱신해서 최대값을 구해야 하기 때문이다.

 

User를 순회하면서  discount 할인기준과 price 가격을 구한뒤,

 

할인기준이 맞다면 이모티콘 구입을, 맞지않으면 구입을 하지않는다.

 

이렇게 구입절차가 완료댄후,  구입비가 price보다 높다면 가입을 하고, 낮다면 수익을 올린다.

 

 

이후, 해당 할인율에대해 가입한 회원과 수익을  지금까지 구한 최대 회원과 최대 수익을 비교하는 로직이다.

 

이 로직이 있어야 최적의 경우수를 판단할수있다.    

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Solution {
    
int sign=0;
int earn=0;
    public int[] solution(int[][] users, int[] emoticons) {
        int[] answer = new int [2];
        
        int[] arr =new int[emoticons.length];
        
        comb(arr,0,users,emoticons);
        
        answer[0]=sign;
        answer[1]=earn;
        
        return answer;
    }
    
    public void comb(int[] arr,int start,int[][] users,int[] emoticons){
        
        if(start==arr.length){
            calculate(arr,users,emoticons);
            return;
        }
        
        for(int i=10;i<=40;i+=10){
            arr[start]=i;
            comb(arr,start+1,users,emoticons);
        }
        
    }
    
    public void calculate(int[] arr,int[][] users,int[] emoticons){
        
        int count=0;
        int earn_t=0;
        
        for(int[] user:users){
            int discount= user[0];
            int price =user[1];
            int sum=0;
            
            for(int i=0;i<arr.length;i++){
                if(arr[i]>=discount){
                    sum+=(emoticons[i]/100)*(100-arr[i]);
                }
            }
            
            if(sum>=price){
                count++;
            }
            else{
                earn_t+=sum;
            }  
        }
        
        
        if(count>sign){
            sign=count;
            earn=earn_t;
            return;
        }    
        else if(count==sign){
            if(earn<earn_t){
                earn=earn_t;
            }
        }
    }
    
}
cs
반응형