반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- baekjoon
- BOJ
- Lv.1
- programmers
- dynamic programming
- dfs
- ProblemSolving
- 백준
- Java
- backtracking
- algorithm
- BFS
- SW역량테스트
- PS
- recursive
- 문자열
- 아기상어
- Lv.2
- Permutation
Archives
- Today
- Total
berry
[Programmers] 이모티콘 할인행사(Lv.2) - Java 본문
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/150368
카카오톡에서는 이모티콘을 무제한으로 사용할 수 있는 이모티콘 플러스 서비스 가입자 수를 늘리려고 합니다.
이를 위해 카카오톡에서는 이모티콘 할인 행사를 하는데, 목표는 다음과 같습니다.
- 이모티콘 플러스 서비스 가입자를 최대한 늘리는 것.
- 이모티콘 판매액을 최대한 늘리는 것.
1번 목표가 우선이며, 2번 목표가 그 다음입니다.
이모티콘 할인 행사는 다음과 같은 방식으로 진행됩니다.
- n명의 카카오톡 사용자들에게 이모티콘 m개를 할인하여 판매합니다.
- 이모티콘마다 할인율은 다를 수 있으며, 할인율은 10%, 20%, 30%, 40% 중 하나로 설정됩니다.
카카오톡 사용자들은 다음과 같은 기준을 따라 이모티콘을 사거나, 이모티콘 플러스 서비스에 가입합니다.
- 각 사용자들은 자신의 기준에 따라 일정 비율 이상 할인하는 이모티콘을 모두 구매합니다.
- 각 사용자들은 자신의 기준에 따라 이모티콘 구매 비용의 합이 일정 가격 이상이 된다면, 이모티콘 구매를 모두 취소하고 이모티콘 플러스 서비스에 가입합니다.
[풀이]
할인율이 10, 20, 30, 40%가 있고 이모티콘 각각에 적용될 수 있다.
이 부분을 보고 중복순열을 생각했음.
중복 순열 : 중복 가능한 n개에서 r개를 선택하는 방법
조합의 기준을 할인율로 잡고
10% 10% 10% 10%
10% 10% 10% 20%
...
40% 40% 40% 40%
이렇게 경우의 수가 나올 수 있는데
정말 쉽게 생각하면
중복 가능한 n개 = 할인율(이모티콘 모두가 같은 할인율이 될 수 있기 때문에)
r개 = 이모티콘의 가짓수
이모티콘의 가짓수는 1<=m<=7이기 때문에
최대 경우의 수는 4^7이 된다.
이렇게 중복순열을 생각해내면
할인율 배열(sales)에서 재귀를 통해 이모티콘의 할인율과 할인된 가격을 리스트에 담아서
각 재귀마다 조건들을 걸어주고 계산해보면 된다.
[소스코드]
import java.util.*;
class Solution {
static class Imoticon{
double price;
double percent;
Imoticon(double price, double percent){
this.price = price;
this.percent = percent;
}
}
static double[] sales = {0.1, 0.2, 0.3, 0.4};
static List<Imoticon> imsi = new ArrayList<>();
static int maxJoin=Integer.MIN_VALUE, maxPrice = Integer.MIN_VALUE;
public int[] solution(int[][] users, int[] emoticons) {
int[] answer = new int[2];
//중복 순열을 위한 재귀함수
dfs(0, users, emoticons);
answer[0] = maxJoin;
answer[1] = maxPrice;
return answer;
}
public static void dfs(int depth, int[][] users, int[] emoticons){
if(depth == emoticons.length){
int total = 0;
int join = 0;
for(int i=0;i<users.length;i++){
int userPercent = users[i][0];
int userPrice = users[i][1];
//개인이 이모티콘을 구매한 금액의 합
int sum = 0;
for(int j=0;j<imsi.size();j++){
Imoticon cur = imsi.get(j);
double curPrice = cur.price;
double curPercent = cur.percent;
//이모티콘의 할인율이 유저가 정한 할인율 이상이면 풀매수
if(curPercent >= userPercent)
sum += curPrice;
}
if(sum >= userPrice)
join++;
else{
total += sum;
}
if(maxJoin < join){
maxPrice = total;
maxJoin = join;
}else if(maxJoin == join && maxPrice < total){
maxPrice = total;
}
}
return;
}
for(int i=0;i<sales.length;i++){
//Imoticon클래스를 자료형으로 가진 리스트에 할인된 가격 및 할인율을 담아준다.
//중복 순열이기 때문에 visited와 같은 방문체크를 할 필요가 X
imsi.add(new Imoticon(((1-sales[i])*(emoticons[depth])), (100*sales[i])));
dfs( depth+1, users, emoticons);
imsi.remove(imsi.size()-1);
}
}
}
반응형
'Problem Solving > Programmers' 카테고리의 다른 글
[Programmers] 개인정보수집유효기간(Lv.1) - Java (0) | 2023.03.08 |
---|---|
[Programmers] 바탕화면 정리(Lv.1) - Java (0) | 2023.03.04 |
[Programmers] 무인도 여행(Lv.2) - Java (0) | 2023.03.02 |
[Programmers] 카드 뭉치(Lv.1) - Java (0) | 2023.03.01 |
[Programmers] 둘만의 암호(Lv.1) - Java (0) | 2023.02.15 |