[프로그래머스/Lv. 2] 이모티콘 할인행사 (JAVA)
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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