쌓고 쌓다

[프로그래머스] 할인 행사 C++ 풀이 본문

알고리즘/프로그래머스

[프로그래머스] 할인 행사 C++ 풀이

승민아 2023. 3. 5. 11:50

https://school.programmers.co.kr/learn/courses/30/lessons/131127

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 방법

모든 날짜로부터 10일을 세어보며 내가 필요한 제품을 모두 살 수 있는지 확인하면 된다.

시작 날짜 i로부터 i+10까지 탐색하며

내가 필요한 제품이랑 일치한다면 해당 물품의 필요 개수를 -1 해주며 풀어간다.

만약 시작 날짜 i로부터 i+10이 배열의 범위를 넘어갈 수 있으니 조심하자.

 

시작 날짜 i로부터 10일 치 제품을 모두 탐색한 후

내가 필요로한 제품의 배열 want(v)를 돌며 양수가 있는지 확인한다.

양수가 있다면 내가 필요한 만큼 모두 사지 못한 것이니

시작 날짜 i에 회원가입은 하지 않는다.

모두 1보다 크지 않다라면 필요한 제품을 모두 살 수 있는 것이니 answer에 1을 더해준다.

 

전체 코드

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(vector<string> want, vector<int> number, vector<string> discount) {
    int answer = 0;
    vector<int> v;
    
    for(int i=0; i<discount.size(); i++) { // discount의 모든 인덱스에서 10일 카운트
        int idx = i; // idx는 시작위치 i로 초기화
        v=number; // v에 필요한 개수들을 초기화
        
        while(idx < discount.size() && idx < i+10) { // idx는 discount를 넘을 수 없고, 시작 i부터 10일을 초과 불가
            for(int j=0; j<want.size(); j++) { // want의 모든 인덱스(j)를 비교하며 discount[idx]와 일치하는 제품 찾기
                if(want[j]==discount[idx]) { // 일치하면
                    v[j]--; // 해당 제품의 원하는 개수 감소
                }
            }
            idx++; // 다음날로 이동
        }
        
        bool flag = false; // 필요한만큼 못산 제품이 있는지 판별
        for(int k=0; k<v.size(); k++) { // 벡터 v를 모두 탐색
            if(v[k]>0) // 필요한 개수가 1이상이면 필요한만큼 모두 못산것임
                flag=true; // 못산 제품이 있다(true)로 갱신
        }
        
        if(flag==false) // 위의 반목문을 모두 돌았더니 false라면
            answer++; // 모든 제품을 필요한만큼 모두 산 것이니 답 추가
    }
    
    
    return answer;
}

 

 

 

 

 

 

 

Comments