#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
int is_expired(string today, string p, int Validity) {
int year = stoi(p.substr(0, 4));
int month = stoi(p.substr(5, 2));
int day = stoi(p.substr(8, 2));
int year2 = stoi(today.substr(0, 4));
int month2 = stoi(today.substr(5, 2));
int day2 = stoi(today.substr(8, 2));
int pToDays = (year * 12 * 28) + (month * 28) + day - 1 + Validity * 28;
int tToDays = (year2 * 12 * 28) + (month2 * 28) + day2;
return pToDays < tToDays ? 1 : 0;
}
vector<int> solution(string today, vector<string> terms, vector<string> p) {
vector<int> answer;
map<char, int> m;
char alpha;
int month;
for (int i = 0; i < terms.size(); i++) {
stringstream ss;
ss.str(terms[i]);
while (ss >> alpha >> month) m[alpha] = month;
}
for (int i = 0; i < p.size(); i++)
if (is_expired(today, p[i], m[p[i][11]]))
answer.push_back(i + 1);
return answer;
}
처음에 든 생각은 class를 만들어서 만료일까지 계산하여 인스턴스 멤버로 저장하려고 했는데, 그렇게 코딩을 하던 와중에 갑자기 든 생각이 있었다.
만약 그렇게 코딩을 한다면 반복문도 많이 돌 것이고, 직접 날짜를 더하고 빼는 과정에서 내림 올림 연산이 많아지기에 번거로워서 굳이 그렇게 해야하나 싶었다. 단순히 생각해보면 아래와 같다.
stringstream으로 공백 파싱 후 map에 알파벳 별 유효기간 terms를 정리한 후, 두 날짜를 일 수로 변환하고, 만료를 확인해야 하는 개인정보 p는 날짜 일수 개인정보 맨 뒷자리에 알파벳에 매핑되는 유효기간까지 더한 뒤에 두 숫자를 비교하면 되는 문제였다.
단순히 생각한 방식대로 구현해서 코드가 좀 더럽다. 이쁘게 정리해서 하려다가 코딩테스트는 시간이 생명이기에 패스했다.