[프로그래머스/C++]Lv.2 - 할인 행사

YH J·2023년 9월 18일
0

프로그래머스

목록 보기
147/168

문제 링크

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

내 풀이

map을 이용해서 want와 number를 합치고, sum을 구한다
discount를 for문을 돌리면서 만들어둔 map에서 discount[j]에 해당하는 value를 -- 해가면서 0 미만이 되면 바로 멈추고 다음것 부터 다시시작, 정상적으로 --되면 sum도 --한다.
정상적으로 for문을 끝냈을 때 sum이 0이면 answer++한다.

내 코드

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

using namespace std;

int solution(vector<string> want, vector<int> number, vector<string> discount) {
    int answer = 0;

    map<string,int> m;
    int sum = 0;

    for(int i = 0; i < want.size(); i++)
    {
        m[want[i]] = number[i];
        sum += number[i];
    }

    map<string,int> mc;
    int sum2;
    for(int i = 0; i <= discount.size() - sum; i++)
    {
        mc = m;
        sum2 = sum;
        for(int j = i; j < i + sum; j++)
        {
            if(--mc[discount[j]] < 0)
                break;
            sum2--;
        }
        if(sum2 == 0)
            answer++;
    }

    return answer;
}

다른 사람의 풀이

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

using namespace std;

int solution(vector<string> want, vector<int> number, vector<string> discount)
{
    int answer=0;
    map<string,int> m;
    for(int i=0; i<9; i++) m[discount[i]]++;
    for(int i=9; i<discount.size(); i++)
    {
        m[discount[i]]++;
        bool flag=true;
        for(int j=0; j<want.size(); j++)
            if(m[want[j]]!=number[j])
            { flag=false; break; }
        if(flag==true) answer++;
        m[discount[i-9]]--;
    }
    return answer;
}

다른 사람의 풀이 해석

want와 number을 정리하지 않고 discount를 쓴다.
discount원소의 9번째 까지만 일단 map에 추가한다.
10번쨰 원소부터 for문을 돌리는데 m[want[j]]와 number[j]가 같지 않으면 flag가 false가 되고 break가 된다 ( 수량체크해서 맞지 않은걸 검출 )
flag가 true면 answer++하고 그것과 상관없이 discount의 젤 처음 원소를 맵에서 --해준다.

profile
게임 개발자 지망생

0개의 댓글