문제 설명

회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 하는 마트에, 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하고자 할 때 원하는 제품을 모두 할인 받을 수 있는 회원 등록 날짜의 수 return

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이법

map을 사용하여서 할인하는 제품과 할인하는 날짜 수를 넣고, 확인하는 방식으로 문제를 풀었다

map을 잘 사용해보지 않아서 비효율적인 코드가 있을 수 있음 (ex) count 등등..)

 

가장 겉의 for문은 총 반복할 횟수이다. 만일 discount의 수가 11이라면 총 2번을 반복하는 것이고, 10이라면 1번을 반복하는 것이다

총 10일동안 할인하는 것을 봐야하므로, discount에 있는 10개의 항목들을 보면서 map에 집어넣는다

만일, map에 제품이 없다면 1을 넣어주고, 있다면 + 1을 해준다

 

이제 want를 순회하면서 want의 제품이 map에 있는지 확인하고, 없으면 해당 날은 회원등록을 할 수 없으니 바로 break 해준다

만일 값이 있는데 number에 있는 수 만큼 들어있지 않다면 이 역시도 회원등록을 할 수 없으니 break 해준다

값이 있고, 수가 정확하다면 value를 0으로 맞춰준다

 

최종적으로 map을 한 번씩 돌면서 value가 0이 아닌 것이 있다면 바로 break 해준다

 

이 모든 것이 걸리지 않는다면 회원등록을 해도 되는 날이므로 answer + 1을 해준다 

 

 

 

소스 코드

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

using namespace std;

int solution(vector<string> want, vector<int> number, vector<string> discount) {
    int answer = 0;
    
    for (int i = 0; i <= discount.size() - 10; i++) {
        bool flag = true;
        map<string, int> m;
        
        for (int j = i; j < i + 10; j++) {
            
            if (m.count(discount[j]) == 0)
                m[discount[j]] = 1;
            else
                m[discount[j]] += 1;
        }
        
        for (int j = 0; j < want.size(); j++) {
            if (m.count(want[j]) == 0) {
                flag = false;
                break;
            }
            else {
                if (m[want[j]] != number[j]) {
                    flag = false;
                    break;
                }
                else
                    m[want[j]] = 0;
            }
        }
        
        map<string, int>::iterator it;
        
        for (it = m.begin(); it != m.end(); it++) {
            if (it->second != 0)
            {
                flag = false;
                break;
            }
        }
        
        if (flag == true)
            answer++;
    }
    
    return answer;
}
복사했습니다!