문제



문제 해석
1. 문자열 가지고 놀기다
2. terms를 map<char, int>로 하여 문자에 매칭되는 달수로 변환
3. today를 숫자 배열로 하여 나중에 날짜 비교할 때 써먹기
4. privacies에 들어있는 것들도 마지막 문자를 빼서 미리 더해줄 달 수로 변환해놓고 나머지 문자열로 이루어진 날짜를 구한다.
5. 구해진 날짜와 더해줄 달 수, 그리고 파기일자이므로 -1처리를 해준다.
6. 숫자 비교를 위해 today와 파기일자를 년+월+일로 이루어진 숫자로 변환하여 비교연산 후 넘어갔으면 정답 배열에 삽입
7. 정답 배열을 정렬하고 반환한다.
코드
#include <string>
#include <vector>
#include <map>
#include <sstream>
#include <algorithm>
using namespace std;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
map<char, int> TermsMap;
char TermChar;
for (string& Term : terms)
{
// Term에서 첫 글자 떼오기
TermChar = Term[0];
Term.erase(0, 2);
TermsMap[TermChar] = stoi(Term);
}
// today를 숫자 배열로 변환
vector<int> Today;
stringstream sstream = stringstream(today);
string word;
{
while (getline(sstream, word, '.'))
{
Today.push_back(stoi(word));
}
}
int NumOfInfo = static_cast<int>(privacies.size());
bool bNeedErase = false;
int ToEraseDay = 0;
string Day;
for (int IDX = 0; IDX < NumOfInfo; ++IDX)
{
Day = privacies[IDX];
bNeedErase = false;
TermChar = *(Day.end() - 1);
int Month = TermsMap[TermChar];
Day.erase(Day.end() - 1, Day.end());
vector<int> ToEraseDay;
{
sstream = stringstream(Day);
while (getline(sstream, word, '.'))
{
ToEraseDay.push_back(stoi(word));
}
#define YEAR 0
#define MONTH 1
#define DAY 2
ToEraseDay[MONTH] += Month;
ToEraseDay[DAY] -= 1;
// 일자 처리. 1일보다 작으면 달 수를 하나 빼야한다.
if (ToEraseDay[DAY] < 1) { ToEraseDay[MONTH] -= 1; ToEraseDay[DAY] = 28; }
// 달 처리. 12달보다 크다면 연 수를 증가시켜야 한다. 12보다 작아질때까지 반복한다.
while (ToEraseDay[MONTH] > 12)
{
ToEraseDay[MONTH] -= 12;
++ToEraseDay[YEAR];
}
}
if (Today[YEAR] * 10000 + Today[MONTH] * 100 + Today[DAY] > ToEraseDay[YEAR] * 10000 + ToEraseDay[MONTH] * 100 + ToEraseDay[DAY])
{
answer.push_back(IDX + 1);
}
}
sort(answer.begin(), answer.end());
return answer;
}
다른 사람의 풀이
1. 비슷하지만 더 심플하게 풀이했다.