프로그래머스/lv2/131127. 할인 행사

SITY·2023년 9월 13일
0

Cpp_Algorithm

목록 보기
2/43

#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을 몇번이라도 써봤다면 코드를 더 효율적으로 짰을 것 같다고 생각했다

profile
·ᴗ·

0개의 댓글