https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
제한 사항에서 이모티콘은 최대 8개, 할인의 종류는 4개이다. 8개 이모티콘에 대한 모든 할인의 경우의 수는
4*4*....*4 = 4^8 만큼의 경우의 수를 구하면 된다.
이 4개의 할인 경우의 수를 0,1,2,3 이라는 캐릭터에 담아서, 8자리 문자열에 저장하는 것으로 경우의 수를 표현했다.
ex) 01010101 -> 1째 == 10%,2째 == 20%,....8째 == 20%
dfs를 통해 가능한 모든 문자열을 생성한 뒤, 모든 경우의 수에 대해 총 이익, 구독자 수를 구하면서 최대 구독자, 최대 이익을 찾으면 된다.
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> all;
int saleArr[4]={10,20,30,40};
int siz=0;
void make_posibility(vector<int> v){
if(v.size()==siz){
all.push_back(v);
return;
}
for(int i=0;i<4;i++){
v.push_back(i);
make_posibility(v);
v.pop_back();
}
}
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
vector<int> answer;
siz=emoticons.size();
vector<int> tmp;
make_posibility(tmp);
int max_sub=-1,max_total=-1;
for(int p=0;p<all.size();p++){//확률 가짓수
vector<int> sale=all[p];
int sub=0, total=0;
for(int i=0;i<users.size();i++){//각 유저가 해당 세일 상황에서 행동
int my_sum=0,my_sale=users[i][0],max=users[i][1];
for(int s=0;s<siz;s++){
int saleNum=saleArr[sale[s]];
if(saleNum<my_sale) continue;
int sale_price=(emoticons[s]/100)*(100-saleNum);
my_sum+=sale_price;
if(my_sum>=max){ //예산 초과 시 모두 취소 후 구독
my_sum=0;
sub++;
break;
}
}
total+=my_sum;
}
if(max_sub<sub){
max_sub=sub;
max_total=total;
}
if(max_sub==sub&&max_total<total) max_total=total;
}
answer.push_back(max_sub);
answer.push_back(max_total);
return answer;
}
'코딩테스트' 카테고리의 다른 글
카카오 블라인드 채용 2023 미로 탈출 명령어 c++ [사전 순] (0) | 2023.07.18 |
---|---|
[카카오 블라인드 채용 2023] 표현 가능한 이진트리 (0) | 2023.07.17 |
프로그래머스 가장 먼 노드 [C++, 최장거리,BFS) (0) | 2023.07.14 |
[2020 카카오 인턴십] 경주로 건설 c++ 문제 풀이 (다익스트라, 구조체) (0) | 2023.07.09 |
프로그래머스 보석 쇼핑 c++ [투포인트] (0) | 2023.07.08 |