이번문제를 풀면서 꼭 파이선으로 바꿔야겠다는 생각이 들었다..ㅠ
이문제는 특별할것없이 과정은 대략 아래와같다.
Map만들기
//map만들기
for(int i=0;i<terms.size();i++){
string policy = "";
policy += terms[i][0];
int month = 0;
string tmp ="";
for(int j=2;j<terms[i].size();j++){
tmp+=terms[i][j];
}
month = stoi(tmp);
m.insert({policy, month});
}
policies날짜 파싱하기
for(int i=0;i<privacies.size();i++){
string date = "";
int j=0;
for(j=0;j<privacies[i].size();j++){
if(privacies[i][j] != ' '){
date +=privacies[i][j];
}else{
break;
}
}
string policy ="";
policy+=privacies[i][j+1];
//현재 2021.05.02 A 파싱완료
마지막으로 검사하기
int month = m[policy];
if(!mycheck(today,date,month)){
answer.push_back(i+1);
}
mycheck에서 생각해야할게
이게 나도 처음에 너무 빠르게 문제를 풀려고해서, 당한게 뭐냐면, 날짜를 바꾸려고하는게 문제다.
이게 무슨말이냐면 11월에서 6개월을 더하면 17개월 1년 5개월이니까
year를 1추가 month를 5 추가 이러면 너무 빡세다
어차피 개월수가 28일로 한정되어있으니까
이걸 전부 date로 풀어서 전부 계산해서 비교해야한다
예를 들어 today가 2022 04 25라면
20221228 + 428 + 25
그리고 date가 2021 01 25이고 month가 5개월 추가라면
20211228 + 128 + 25
에다가 보관가능날짜는 1빼야하므로 1빼서 비교한다.
bool mycheck(string today, string date, int addmonth){
string ty="";
string tm="";
string td="";
for(int i=0;i<4;i++){
ty+=today[i];
}
for(int i=5;i<7;i++){
tm+=today[i];
}
for(int i=8;i<10;i++){
td+=today[i];
}
string y="";
string m="";
string d="";
for(int i=0;i<4;i++){
y+=date[i];
}
for(int i=5;i<7;i++){
m+=date[i];
}
for(int i=8;i<10;i++){
d+=date[i];
}
long long todaytotal= stoi(ty) * 12 * 28 + stoi(tm) * 28 + stoi(td);
long long pritotal = stoi(y) * 12 * 28 + (stoi(m)+addmonth) * 28 + stoi(d);
if(todaytotal>pritotal-1){
return false;
}
return true;
}
총코드
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
map<string,int> m;
bool mycheck(string today, string date, int addmonth){
string ty="";
string tm="";
string td="";
for(int i=0;i<4;i++){
ty+=today[i];
}
for(int i=5;i<7;i++){
tm+=today[i];
}
for(int i=8;i<10;i++){
td+=today[i];
}
string y="";
string m="";
string d="";
for(int i=0;i<4;i++){
y+=date[i];
}
for(int i=5;i<7;i++){
m+=date[i];
}
for(int i=8;i<10;i++){
d+=date[i];
}
long long todaytotal= stoi(ty) * 12 * 28 + stoi(tm) * 28 + stoi(td);
long long pritotal = stoi(y) * 12 * 28 + (stoi(m)+addmonth) * 28 + stoi(d);
if(todaytotal>pritotal-1){
return false;
}
return true;
}
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
//map만들기
for(int i=0;i<terms.size();i++){
string policy = "";
policy += terms[i][0];
int month = 0;
string tmp ="";
for(int j=2;j<terms[i].size();j++){
tmp+=terms[i][j];
}
month = stoi(tmp);
m.insert({policy, month});
}
for(int i=0;i<privacies.size();i++){
string date = "";
int j=0;
for(j=0;j<privacies[i].size();j++){
if(privacies[i][j] != ' '){
date +=privacies[i][j];
}else{
break;
}
}
string policy ="";
policy+=privacies[i][j+1];
//현재 2021.05.02 A 파싱완료
int month = m[policy];
if(!mycheck(today,date,month)){
answer.push_back(i+1);
}
}
return answer;
}