https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
할인율 변수 범위 4, 이모티콘 변수 범위 7 이기 때문에, 모든 할인율에 대해 검사하는 O(4^7)으로 DFS를 돌려도 괜찮겠다고 생각했다.
1. discountRate 벡터 길이가 이모티콘 수와 같아지면, 모든 유저에 대해 이모티콘 총액 계산을 진행한다.
2. 한도 이상 쓴 경우 serviceUser++, tmpMoney=0 처리 후 break한다.
3. 모든 유저에 대해 계산이 끝나면, 문제 기준에 맞게 답을 업데이트 한다. (가입 유저 > 판매액 순)
#include <string>
#include <vector>
using namespace std;
// 가입자 > 판매액
int dr[4]={10, 20, 30, 40};
int ans1, ans2;
void dfs(vector<int> discountRate, vector<vector<int>> users, vector<int> emoticons){
if (discountRate.size()==emoticons.size()){
int serviceUser=0;
int salesMoney=0;
for (int i=0; i<users.size(); i++){
int userDiscountRate = users[i][0];
int maxMoney = users[i][1];
int tmpMoney=0;
// 이모티콘 구매 진행
for (int j=0; j<emoticons.size(); j++){
int dcr = discountRate[j];
// 구매가능
if (dcr >= userDiscountRate){
int newPrice = emoticons[j]*(100-dcr)/100;
tmpMoney+= newPrice;
}
// 한도 이상 쓴 경우, 유저 추가
if (tmpMoney>=maxMoney){
tmpMoney=0;
serviceUser++;
break;
}
}
// 유저 한명에 대한 판매액 업데이트
salesMoney+=tmpMoney;
}
// 유저 우선
if (serviceUser>ans1){
ans1=serviceUser;
ans2=salesMoney;
}
// 유저 수 같을 경우 판매액 우선
else if (serviceUser==ans1){
if (salesMoney > ans2){
ans2 = salesMoney;
}
}
}
else{
for (int i=0; i<4; i++){
discountRate.push_back(dr[i]);
dfs(discountRate, users, emoticons);
discountRate.pop_back();
}
}
};
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
vector<int> answer;
vector<int> dcRate;
dfs(dcRate, users, emoticons);
answer.push_back(ans1);
answer.push_back(ans2);
return answer;
}
'프로그래머스 > Lv.2' 카테고리의 다른 글
[C++] 프로그래머스 단체사진 찍기 (0) | 2023.02.08 |
---|---|
[C++] 프로그래머스 빛의 경로 사이클 (0) | 2023.02.08 |
[C++] 프로그래머스 시소 짝꿍 (0) | 2023.02.08 |
[C++] 프로그래머스 숫자 변환하기 (0) | 2023.02.07 |
[C++] 프로그래머스 택배 배달과 수거하기 (0) | 2023.02.07 |