원하는 것은 뭐든지
99클럽 코테 스터디 28일차 - 프로그래머스, 이모티콘 할인행사 본문
반응형
문제 풀이 예상 시간보다 지나가면 다른 해석을 보고 있습니다.
문제
풀이
문제 해석
1. 이모티콘 플러스를 가입하도록 만들고 싶습니다.
2. 유저 배열이 주어지는데 각 유저들은 [원하는 할인율, 예산]을 가지고 있습니다.
3. 유저들은 원하는 할인율보다 같거나 높을 경우만 구매합니다.
4. 이모티콘들의 할인율은 10,20,30,40 만 있다고 가정합니다.
5. 만약 유저들이 할인율대로 구매했을 때 본인의 예산을 넘어가게 되면 이모티콘 플러스를 가입합니다.
6. 유저들의 이모티콘 플러스가입을 유도하기 위해 이모티콘들의 할인율을 지정하면 됩니다.
7. 이모티콘 플러스가 가장 우선되고 그다음으로 이모티콘 구매가격이 우선됩니다
8. 그러니까 이모티콘 가입 수 내림차순 이모티콘 구매가격 내림차순 했을 경우 가장 위의 값
문제 풀이
1. 완전탐색을 통해 해결했다.
2. 우선 할인율을 선택해야 했다. dfs를 이용해 할인율을 선택한다.
3. 만약 선택이 완료되었을 때는 선택된 할인율을 가격에 반영하고 각 유저들이 그 이모티콘을 구매하는지 확인한다.
4. 위의 과정만 구현하면 완료된다.
5. 코드를 보면 이해가능하다.
소스코드
package online.judge.programmers;
public class 이모티콘_할인행사 {
public static void main(String[] args) {
Solution solution = new Solution();
solution.solution(
new int[][]{{40,10000},{25,10000}},
new int[]{7000,9000}
);
solution = new Solution();
solution.solution(
new int[][]{{40,2900},{23,10000},
{11,5200}, {5,5900}, {40,3100},
{27,9200},{32,6900}},
new int[]{1300,1500,1600,4900}
);
}
static class Solution {
int emoLen;
int[] emoDis;
int[] emoticons2;
int[][] users2;
int[] discount = {10, 20, 30, 40};
int[] answer = new int[2];
public int[] solution(int[][] users, int[] emoticons) {
emoticons2 = emoticons;
users2 = users;
//이모티콘 개수
emoLen = emoticons.length;
//선택한 할인률
emoDis = new int[emoLen];
selectDiscount(0, 0);
return answer;
}
private void selectDiscount(int choice, int start){
if(choice == emoLen){
int[] price = new int[emoLen];
//할인 가격 저장
for (int i = 0; i < emoLen; i++) {
price[i] = emoticons2[i] * (100 - emoDis[i]) / 100;
}
int emoticonPlus = 0;
int purchase = 0;
//유저 비교
for (int i = 0; i < users2.length; i++) {
int dis = users2[i][0];
int budget = users2[i][1];
int purchase2 = 0;
for (int j = 0; j < emoLen; j++) {
if(emoDis[j] >= dis){
budget -= price[j];
purchase2 += price[j];
}
if(budget <= 0){
emoticonPlus++;
purchase2 = 0;
break;
}
}
purchase += purchase2;
}
if(answer[0] < emoticonPlus){
answer[0] = emoticonPlus;
answer[1] = purchase;
}else if(answer[0] == emoticonPlus){
answer[1] = Math.max(answer[1], purchase);
}
return;
}
for(int i=start;i<emoLen;i++){
for(int j=0;j<4;j++){
emoDis[choice] = discount[j];
selectDiscount(choice+1, i+1);
}
}
}
}
}
TIL
- 처음에 문제를 보고 무서워서 힌트를 봤다.
- 충분히 해결 할 수 있는 문제임에도 불구하고 무서워서 힌트를 본 게 너무 한심하고 아쉬웠다.
- 제한사항들을 제대로 파악하여 구현할 수 있는지 범위를 확실히 하자.
반응형
'개발 > 문제풀이' 카테고리의 다른 글
99클럽 코테 스터디 30일차 - 백준, 택배 배송 (0) | 2024.11.27 |
---|---|
99클럽 코테 스터디 29일차 - 백준, 타임머신 (0) | 2024.11.26 |
99클럽 코테 스터디 27일차 - 백준, 지름길 (0) | 2024.11.24 |
99클럽 코테 스터디 26일차 - 프로그래머스 , 주사위 고르기 (0) | 2024.11.23 |
99클럽 코테 스터디 25일차 - 백준 , 로봇 조종하 (0) | 2024.11.22 |
Comments