#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<string> want, vector<int> number, vector<string> discount)
{
int cnt = 0;
vector<string> v;
for (int i = 0; i < number.size(); i++)
for (int j = 0; j < number[i]; j++)
v.push_back(want[i]);
sort(v.begin(), v.end());
for (int i = 0; i <= discount.size() - v.size(); i++)
{
vector<string> dis(discount.begin() + i, discount.begin() + i + 10);
sort(dis.begin(), dis.end());
bool sign = true;
int count = v.size();
for (int j = 0; j < v.size(); j++)
{
if (v[j] != dis[j])
sign = false;
else
count--;
}
if (sign && !count)
cnt++;
}
return cnt;
}
처음 보자 마자 든 생각은 std::Map을 사용해서 물건과 물건 개수를 쌍으로 넣은 뒤 루프를 돌며 map[discount]에 해당하는 Value를 하나씩 내리고 모든 Value가 0이라면 cnt를 하나씩 올려서 return할 생각이였는데,
map에 익숙치 않아서 Vector를 사용했다.
사야하는 물건의 개수만큼 v에 모두 할당, 정렬하고 할인하는 물건들을 i번째부터 i + 10번째 까지 dis라는 임시vector에 할당, 정렬했다.
그리고 i부터 discount.size() - v.size()까지 루프를 돌려준다면 모든 가능한 날짜를 체크할 수 있다.
v를 정렬하고, dis를 정렬한 뒤, 두개의 벡터가 일치한다면 사야하는 모든 물품과 10일 간 살 수 있는 물건이 일치하는 것이기에, 그것을 체크하는 sign과 사야하는 물건 개수를 count에 넣고 두개의 인덱스가 다르다면 false로 체크, 같다면 count를 하나씩 내렸다. 내부루프에서 나온 뒤 sign이 true고 count가 0개라면 조건에 맞는 것이기 때문에 cnt를 올리게 하고 외부루프를 나온 뒤 return했다.
map을 몇번이라도 써봤다면 코드를 더 효율적으로 짰을 것 같다고 생각했다