https://school.programmers.co.kr/learn/courses/30/lessons/150368?language=java
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
입력
2차원 배열 users는 각 유저의 할인 기준과 구매 기준 금액
각 요소는 [할인 기준 %, 구매 기준 금액] 형식
정수 배열 emoticons는 이모티콘 정가 리스트이며, 각 이모티콘마다 10%, 20%, 30%, 40% 중 하나의 할인율을 선택 가능
핵심 아이디어
각 이모티콘에 대해 10%, 20%, 30%, 40% 할인율을 적용한 모든 조합을 완전탐색
각 조합마다 모든 유저가 어떻게 반응하는지를 시뮬레이션
사용자는 자신이 설정한 할인 기준 이상인 이모티콘만 구매 대상으로
총 구매 금액이 기준 금액 이상이면 이모티콘 플러스에 가입하고, 구매 X
그 외의 경우에는 구매한 이모티콘들의 금액을 모두 합산
가입자 수를 우선으로 비교하고, 같을 경우 총 판매 금액이 높은 조합을 선택
변수 설명
plus: 현재까지 나온 최대 플러스 가입자 수
buy: plus 기준에서의 최대 이모티콘 판매 금액
arr: 현재 할인율 조합을 저장하는 배열 (이모티콘 개수와 동일한 길이)
recursive: 가능한 모든 할인율 조합을 탐색하는 재귀 함수
calc: 현재 할인 조합에서 유저 반응을 계산하는 함수
userPer: 해당 유저가 구매를 고려하는 최소 할인율
userLimit: 해당 유저의 플러스 가입 기준 금액
sum: 유저가 실제 구매한 총 금액
cnt: 현재 조합에서 플러스 가입한 유저 수
buySum: 실제 구매가 발생한 총 금액
예시
- 입력
users = { {40, 10000}, {25, 10000} }
emoticons = {7000, 9000}
가능한 할인 조합은 4^2 = 16가지이다
예를 들어 할인율 조합이 [40, 40]이면
7000 * 0.6 = 4200
9000 * 0.6 = 5400
유저 1은 40% 이상만 보기 때문에 두 이모티콘 모두 구매
총합 9600 → 10000 미만 → 구매함
유저 2는 25% 이상 조건 만족, 동일하게 총합 9600 → 구매함
따라서 플러스 가입자 0명, 구매 총액 19200원
이와 같은 방식으로 모든 조합을 비교해 가장 많은 가입자 수와 가장 높은 판매금액 조합을 선택
- 출력
[최대 플러스 가입자 수, 해당 조건에서의 최대 판매 금액] 형태의 정수 배열을 반환
정답코드
import java.util.*;
class Solution {
private int plus = 0;
private int buy = 0;
public int[] solution(int[][] users, int[] emoticons) {
int[] arr = new int[emoticons.length];
recursive(arr, 0, users, emoticons);
return new int[]{plus, buy};
}
public void recursive(int[] arr, int startIdx, int[][] users, int[] emoticons){
if(startIdx == arr.length){
calc(arr, users, emoticons);
return;
}
for(int i=10; i<=40; i+=10){
arr[startIdx] = i;
recursive(arr, startIdx+1 ,users, emoticons);
}
}
private void calc(int[] arr, int[][] users, int[] emoticons){
int cnt = 0;
int buySum = 0;
for(int i=0; i<users.length; i++){
int userPer = users[i][0];
int userLimit = users[i][1];
int sum = 0;
for(int j=0; j<arr.length; j++){
if(arr[j] >= userPer){
sum += emoticons[j] * (100 - arr[j]) / 100;
}
}
if(sum >= userLimit){
// 유저 구매 상한보다 높으면 이모티콘 플러스 가입
cnt++;
} else{
// 낮으면 그냥 구매
buySum+=sum;
}
}
if(cnt > plus){
plus = cnt;
buy = buySum;
}
if(cnt == plus){
if(buy < buySum){
buy = buySum;
}
}
}
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 조이스틱 Java (1) | 2025.07.05 |
---|---|
[프로그래머스] 지게차와 크레인 Java (0) | 2025.07.05 |
[프로그래머스] 미로 탈출 Java (0) | 2025.07.05 |
[프로그래머스] 게임 맵 최단거리 Java (0) | 2025.07.05 |
[프로그래머스] 서버 증설 횟수 Java (0) | 2025.07.05 |