문제

설명

  • 원하는 10개의 할인 물품을 전부 할인 받을 수 있는 가입 날짜의 총합을 구하는 문제

코드

#include <string>
#include <vector>
#include <map>

using namespace std;

bool solve(vector<string> &want, vector<int> &number, map<string ,int> &m) {
    // 10일간의 할인 품목이 원하는 할인 품목인지 확인
    for (int i = 0; i < want.size(); i++) {
        auto it = m.find(want[i]);
        if (it == m.end()) {
            return false;
        }
        if (it->second != number[i]) {
            return false;
        }
    }
    
    return true;
}

int solution(vector<string> want, vector<int> number, vector<string> discount) {
    int answer = 0;
    map<string, int> m;
    
    // 최초 10일 동안의 할인 품목 저장
    for (int i = 0; i < 10; i++) {
        if (m.insert({discount[i], 1}).second == false) {
            m[discount[i]]+=1;
        }
    }

    // 최초 10일 할인 품목이 원하는 품목과 일치하면 카운트 증가
    if (solve(want, number, m)) {
        answer++;
    }
    
    for (int i = 10; i < discount.size(); i++) {
        // 11일 부터 10일 전의 할인 품목 제거, 오늘의 할인 품목 추가 후 할인 품목 여부 검사
        if (m.insert({discount[i], 1}).second == false) {
            m[discount[i]]+=1;
        }
        m[discount[i-10]]-=1;
        if (solve(want, number, m)) {
            answer++;
        }
    }
    
    return answer;
}

댓글을 남기시려면 Github 로그인을 해주세요