Algorithm/programmers
프로그래머스 이모티콘할인행사 // 중복순열, vector<pair<int,int>>정렬방법
Mini_96
2023. 6. 28. 23:35
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
* 중복순열
result에 idx가 저장된다.
result[i]를 가지고 실제데이터에 접근하면된다.
ex) sale[]={10,20,30,40}
result={0,1}
saleV={10,20}
void permRe(){
if(result.size()==N){
//Logic
for(auto i : result){
cout<<i<<" ";
}
return;
}
for(int i=0;i<4;++i){
result.push_back(i);
permRe();
result.pop_back();
}
}
* vector<pair<int,int>>정렬방법
※ 매개변수 : pair<int,int>> v1, v2 여야함에 주의
vector<pair<int,int>> 아님!
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
"<" 정렬 ->오름차순
">" 정렬 -> 내림차순
bool cmp(pair<int,int> v1, pair<int,int> v2){
if(v1.first==v2.first){
return v1.second>v2.second;
}
return v1.first>v2.first;
}
#include <bits/stdc++.h>
using namespace std;
int _sale[]={10,20,30,40};
vector<int> result; //중복조합된 idx들 저장
vector<int> saleV;
vector<pair<int,int>> ret;
vector<vector<int>> Users;
vector<int> Emoticons;
int N;
void buy(){
int allSum=0;
int service=0;
for(auto user:Users){
int sum=0;
bool flag=0;
for(int j=0;j<Emoticons.size();++j){
if(user[0]<=saleV[j]){
sum+=Emoticons[j]/100*(100-saleV[j]);
}
if(sum>=user[1]){
service++;
flag=1;
break;
}
}
if(!flag){
allSum+=sum;
}
}
ret.push_back({service,allSum});
}
//1. 이모티콘할인율 중복조합 10,20,30,40
void permRe(){
if(result.size()==N){
/*for(auto i : result){
cout<<i<<" ";
//cout<<sale[i]<<" ";
}
cout<<endl;*/
//1. 이모티콘별 할인율 저장
//saleV[0] == 이모티콘0번 할인율
for(auto a: result){
//cout<<_sale[a]<<" ";
saleV.push_back(_sale[a]);
}
//2. 할인율이상->구매
buy();
saleV.clear();
return;
}
for(int i=0;i<4;++i){
result.push_back(i);
permRe();
result.pop_back();
}
}
bool cmp(pair<int,int> v1, pair<int,int> v2){
if(v1.first==v2.first){
return v1.second>v2.second;
}
return v1.first>v2.first;
}
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
vector<int> answer;
N=emoticons.size();
Users=users; Emoticons=emoticons;
//for(auto i : sale) cout<<i<<" ";
//1. 이모티콘할인율 조합 10,20,30,40
permRe();
//2. 할인율이상->구매
//3. 가격보다크면 -> 서비스가입
//4. 그때의 서비스가입,판매값 push
//5. 정렬(기준 : 서비스가입수, 같으면 점수순)
sort(ret.begin(),ret.end(),cmp);
for(auto p : ret){
cout<<p.first<<" "<<p.second<<endl;
}
//6. answer.push(마지막)
answer.push_back(ret[0].first);
answer.push_back(ret[0].second);
return answer;
}