https://school.programmers.co.kr/learn/courses/30/lessons/131127
map을 이용해서 want와 number를 합치고, sum을 구한다
discount를 for문을 돌리면서 만들어둔 map에서 discount[j]에 해당하는 value를 -- 해가면서 0 미만이 되면 바로 멈추고 다음것 부터 다시시작, 정상적으로 --되면 sum도 --한다.
정상적으로 for문을 끝냈을 때 sum이 0이면 answer++한다.
#include <string>
#include <vector>
#include <map>
using namespace std;
int solution(vector<string> want, vector<int> number, vector<string> discount) {
int answer = 0;
map<string,int> m;
int sum = 0;
for(int i = 0; i < want.size(); i++)
{
m[want[i]] = number[i];
sum += number[i];
}
map<string,int> mc;
int sum2;
for(int i = 0; i <= discount.size() - sum; i++)
{
mc = m;
sum2 = sum;
for(int j = i; j < i + sum; j++)
{
if(--mc[discount[j]] < 0)
break;
sum2--;
}
if(sum2 == 0)
answer++;
}
return answer;
}
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
int solution(vector<string> want, vector<int> number, vector<string> discount)
{
int answer=0;
map<string,int> m;
for(int i=0; i<9; i++) m[discount[i]]++;
for(int i=9; i<discount.size(); i++)
{
m[discount[i]]++;
bool flag=true;
for(int j=0; j<want.size(); j++)
if(m[want[j]]!=number[j])
{ flag=false; break; }
if(flag==true) answer++;
m[discount[i-9]]--;
}
return answer;
}
want와 number을 정리하지 않고 discount를 쓴다.
discount원소의 9번째 까지만 일단 map에 추가한다.
10번쨰 원소부터 for문을 돌리는데 m[want[j]]와 number[j]가 같지 않으면 flag가 false가 되고 break가 된다 ( 수량체크해서 맞지 않은걸 검출 )
flag가 true면 answer++하고 그것과 상관없이 discount의 젤 처음 원소를 맵에서 --해준다.