코테/프로그래머스

[프로그래머스/Lv. 2] 이모티콘 할인행사 (JAVA)

imname1am 2023. 9. 14. 18:09
반응형

🔺 문제

 

프로그래머스

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

programmers.co.kr

 

 

🔺 코드

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
70
71
72
73
import java.util.*;
import java.io.*;
 
class Solution {
    static int[][] users;
    static int[] emoticons;
    
    static int[] dc, ans;
    static int maxCnt, maxProfit;    // 최대 회원 수, 최대 수익
    
    public int[] solution(int[][] users, int[] emoticons) {
        this.users = users;
        this.emoticons = emoticons;
        
        dc = new int[emoticons.length];    // 이모티콘이 할인되는 퍼센트 저장
        ans = new int[2];
        
        // 이모티콘이 할인되는 분기 모두 탐색 ; 중복 순열 위한 재귀함수
        comb(0);
        
        ans[0= maxCnt;
        ans[1= maxProfit;
        
        return ans;
    }
    
    // 이모티콘이 할인되는 모든 분기 탐색 메소드
    private static void comb(int depth) {
        if(depth == dc.length) { // 모든 할인율 적용 시, 할인율 정해진 상태로 회원과 수익 계산
            calculate();
            return;
        }
        
        for(int i = 10 ; i <= 40 ; i += 10) {
           dc[depth] = i;
           comb(depth + 1);
        }
    }
    
    // 회원과 수익 계산 메소드
    private static void calculate() {
        int user = 0;   // 해당 이모티콘 할인율 적용 시 회원 가입 수
        int profit = 0// 해당 이모티콘 할인율 적용 시 수익
        
        for(int[] u : users) {
            int discount = u[0];
            int price = u[1];
            
            int sum = 0; // 개인이 이모티콘을 구매한 금액의 합
            
            for(int i = 0 ; i < dc.length ; i++) {
                if(dc[i] >= discount) { // 할인 기준이 맞으면 이모티콘 구입
                    sum += (emoticons[i] / 100* (100 - dc[i]);
                }
            }
            
            if(sum >= price)    user++;         // 가입
            else                profit += sum;  // 수익 올림
        }
        
        // 해당 할인율에 대해 가입한 회원과 수익, 최대값으로 갱신
        if(user > maxCnt) {
            maxCnt = user;
            maxProfit = profit;
            return;
        }
        else if(user == maxCnt) {
            if(maxProfit < profit) {
                maxProfit = profit;
            }
        }
    }
}
cs
✅ 해결 아이디어
재귀를 이용한 완전탐색
- 시간 복잡도 : 4^7
- 완전탐색 기준 : 이모티콘이 할인되는 경우의 수 (각 이모티콘이 10,20,30,40% 할인되는 분기 탐색)

 

풀이

1) 완전탐색 통해 모든 가능한 할인 조합을 만든다. comb 메소드 : 중복순열 위한 재귀함수

2) users 배열과 emoticons 배열을 순회하며 계산 calculate 메소드

 

 


🔺 다른 풀이들

로직은 비슷한데 List<int[]> 사용하는 코드도 있었다.

 

(Java) 프로그래머스 - 이모티콘 할인행사

문제를 읽고 대략적인 로직은 빠르게 세워졌지만 구현에는 꽤 많은 시간이 소요되었다. 인풋 값이 크지 않아서 시간 초과는 생각하지 않고 풀었다. 먼저 가능한 할인 조합을 만들고 users 배열과

rovictory.tistory.com


💬 느낀 점

으아 완전탐색을 잘하고 싶다!!!

 

뭔가 조합을 만들 생각까지는 했는데,

그 이후에 생각이 멈춰버렸다...

 

그래서 다른 분들 코드 보고 작성했는데 생각하기까지가 어렵지 코드 자체는 그렇게 어려운 편은 아닌 것 같음,,,,

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

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

문제분석 처음 문제를 접할때 복잡한 문제지만, 기본 로직을 잡고 천천히 풀다보면 쉽게 풀린다. 요점은, 전략을 잘짜는것이다. 제한사항이다. 이모티콘의 할인율은 10 , 20 , 30, 40프로 4가지로 정

taehoung0102.tistory.com

 

[프로그래머스] 이모티콘 할인행사(java)

https://school.programmers.co.kr/learn/courses/30/lessons/150368 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

kimtaesoo99.tistory.com

반응형