본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 할인행사] c++ (코드 및 풀이)

by 말린밴댕이_공부 2023. 5. 15.
반응형

문제 링크

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

 

프로그래머스

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

programmers.co.kr

문제

 

코드 및 풀이 (+ 수정 과정)

 

수정 과정 (오류(초과) 코드)

/*
할인행사

10일 동안 일정 금액 지불 -> 회원자격 부여

결국 회원을 등록할 수 있는 날짜를 다 ++하면 되는거지.

map을 사용하면 편하게 풀 수 있지 않을까?
또한 number의 원소의 합은 무조건 10으로 제한되어있다.
*/

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

using namespace std;

int discountCheck(map<string,int>m, int day, vector<string> discount);

int solution(vector<string> want, vector<int> number, vector<string> discount) {
    int answer = 0;
    int checkDay = discount.size() - 10;
    map<string,int> m;
   
    for(int i = 0; i < number.size();i++){
        m.insert(make_pair(want[i],number[i]));
    }
    for(int i = 0; i <=checkDay;i++)
        answer += discountCheck(m,i,discount);
   
    return answer;
}

int discountCheck(map<string,int>m, int day, vector<string> discount){
    for(int i = day; i< day + 10; i++){
        if(!m[discount[i]])
            return 0;
        m[discount[i]]--;
    }
    return 1;
}

요즘 map을 즐겨 사용하고 있어서 맵에 넣었을때 문제가 찾는것이 없다면 return 0 있다면 1로 하여 10일 까지 진행을 하려 했지만 시간 초과로 인해 코드를 빠르게 갈아 엎었습니다.

 

개인적으로 어려운 문제가 아니니 오류를 찾는것보다 빠르게 갈아엎는것도 시간이 더 빠르다고 생각합니다.

 

고친 코드

#include <string>
#include <vector>

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++){
        vector<int> v = number;
        int flag = 1;
       
        for(int j= 0 ; j < 10;j++){
            for(int k = 0; k < v.size();k++){
                if(want[k] == discount[i + j] && v[k] > 0)
                    v[k]--;
            }
        }
       
        for(int j = 0; j < v.size();j++){
            if(v[j] > 0){
                flag = 0;
                break;
            }
        }
        if(flag == 1)
            answer += 1;
    }
   
    return answer;
}

반복문을 돌면서 벡터에 대해 10일 이상을 비교를 하느 간단하게 반복문을 돌렸습니다.

 

마지막에 flag를 세워서 반복문에 0이 초과되는 숫자가 있다면 break를 하여 시간을 조금이나마 줄였습니다.

 

사실 이중 for문(j,k)도 break를 설정해두면 좋지 않을까도 생각했지만 그러면 간단한 문제에 너무 시간을 오래 투자하는게 아닌가 싶어서 이정도로 그쳤습니다 :)

반응형

댓글