문제 설명
회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 하는 마트에, 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하고자 할 때 원하는 제품을 모두 할인 받을 수 있는 회원 등록 날짜의 수 return
https://school.programmers.co.kr/learn/courses/30/lessons/131127
문제 풀이법
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;
}
'Algorithm Study' 카테고리의 다른 글
[프로그래머스] 3단계 - 정수 삼각형 (0) | 2024.02.01 |
---|---|
[프로그래머스] 2단계 - 프로세스 (0) | 2024.01.30 |
[프로그래머스] 2단계 - n^2 배열 자르기 (0) | 2024.01.30 |
[프로그래머스] 2단계 - 괄호 회전하기 (0) | 2024.01.22 |
[프로그래머스] 2단계 - 귤 고르기 (0) | 2024.01.18 |