반응형
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/131127
문제
코드 및 풀이 (+ 수정 과정)
수정 과정 (오류(초과) 코드)
/*
할인행사
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를 설정해두면 좋지 않을까도 생각했지만 그러면 간단한 문제에 너무 시간을 오래 투자하는게 아닌가 싶어서 이정도로 그쳤습니다 :)
반응형
'알고리즘 > c++ 프로그래머스' 카테고리의 다른 글
[프로그래머스 타겟넘버] c++ (코드, 풀이, 개념) (0) | 2023.05.17 |
---|---|
[프로그래머스 피로도] c++ (문제풀이, 개념, 코드) (0) | 2023.05.17 |
[프로그래머스 뉴스 클러스터링, 2018 카카오] c++ (풀이 및 코드) (0) | 2023.05.15 |
[프로그래머스 프로세스] c++ (풀이, 코드) (0) | 2023.05.14 |
[프로그래머스 기능개발] c++ (코드, 풀이) (0) | 2023.05.14 |
댓글