프로그래머스/자바 Lv2
[프로그래머스] Java Lv2. 코딩테스트 연습 > 2023 KAKAO BLIND RECRUITMENT > 이모티콘 할인행사
행수쌤
2024. 12. 14. 11:08
728x90
반응형
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제설명
사용자 정보 배열에 [이모티콘을 구매할 할인율(비율), 이모티콘 플러스 구매결정 금액(가격)]이 담겨있다.
이모티콘 배열에 현재 이모티콘들의 가격이 담겨있다.
이모티콘별로 할인율이 결정(10%, 20%, 30%, 40%)되는데, 각각의 사용자는 개인의 이모티콘을 구매할 할인율 이상이 적용된 이모티콘을 구입하게 된다.
(구매하기로 결심한 이모티콘들의 할인율이 적용된 가격의 총합) >= (본인의 이모티콘 플러스 구매결정 금액) 이라면 이모티콘 서비스를 가입하게 된다.
이모티콘 서비스 가입자 수를 최대일 때의 판매액 최고 금액을 return한다.
제한사항
- 1 <= users의 길이 <= 100
- 1 <= 비율 <= 40
- 100 <= 가격 <= 1,000,000 가격은 100의 배수
- 1 <= emotions의 길이 <= 7
- 100 <= emotions의 원소 <= 1,000,000
접근방법
이모티콘 할인율이 4가지 경우의수로 한정되어 있고, 이모티콘의 최대 개수는 7개이다. 즉 이모티콘별 할인율을 전체탐색을 해도 4^7가 나오는데 이는 충분히 전체탐색 할만한 수치이다.
이모티콘 개수에 따라 전체 탐색할 케이스를 만들어 전체탐색 후 return 조건에 만족하는 결과를 반환한다.
핵심로직
이모티콘 할인율 전체 경우의수 계산 : 4^(이모티콘개수)
각 경우의 수마다 개인별 구매 결정여부를 판단하고, 이모티콘 플러스 서비스 가입여부 판단하여 카운트
최댓값 구하여 반환
입출력 예
- users = [[40, 10000], [25, 10000]]
- emotions = [7000, 9000]
- result = [1, 5400]
코드작성
class Solution {
public int[] solution(int[][] users, int[] emoticons) {
// 이모티콘별 할인율 배열
int[] saleRate = new int[emoticons.length];
// 이모티콘 할인율 경우의수
int saleRateCase = (int) Math.pow(4, emoticons.length);
int join = 0; // 가입자수
int sum = 0; // 매출액
for(int i=0; i<saleRateCase; i++) {
// 이모티콘별 할인율 계산
for(int j=0; j<saleRate.length; j++) {
saleRate[j] = 10 * (1 + (i / (int) Math.pow(4, j)) % 4);
}
int userJoin = 0;
int userSums = 0;
for(int j=0; j<users.length; j++) {
int userSum = 0; // 유져금액 합계
int userRate = users[j][0];
for(int l=0; l<saleRate.length; l++) {
if(saleRate[l] >= userRate) {
userSum += (emoticons[l] * (100-saleRate[l])) / 100;
}
}
if(userSum >= users[j][1]) {
userJoin ++;
} else {
userSums += userSum;
}
}
if(userJoin == join) {
join = userJoin;
sum = Math.max(sum, userSums);
} else if(userJoin > join) {
join = userJoin;
sum = userSums;
}
}
int[] answer = {join, sum};
return answer;
}
}
728x90
반응형