https://school.programmers.co.kr/learn/courses/30/lessons/150370
문자열 형태의 날짜들의 크고 작음을 어떻게 비교할 것인지에 대해 고민이 많았던 것 같다.
그러던 중 날짜를 총 일수로 바꾼다면, 개인정보 수집일자 + 유효기간을 더하기도 쉽고 오늘 날짜와 비교하기도 쉬울 것이라고 생각이 들어 이러한 방식으로 문제를 해결하려 했다.
#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <iostream>
using namespace std;
// 날짜를 총 일수로 변환 메서드
int DateToDays(const string& date)
{
int year, month, day;
char dot1, dot2;
stringstream ss(date);
ss >> year >> dot1 >> month >> dot2 >> day;
return year * 12 * 28 + month * 28 + day;
}
vector<int> solution(string today, vector<string> terms, vector<string> privacies)
{
unordered_map<string, int> term_map;
// 약관 일수로 변경
for (const string& term : terms)
{
stringstream ss(term);
string type; int month;
ss >> type >> month;
term_map[type] = month * 28;
}
// 오늘 날짜 총 일수로 저장
int today_days = DateToDays(today);
vector<int> answer;
// 개인정보 파기 여부 계산
for (int i = 0; i < privacies.size(); ++i)
{
int privacy_days = DateToDays(privacies[i]);
string date, type;
stringstream ss(privacies[i]);
ss >> date >> type;
privacy_days += term_map[type];
if (today_days >= privacy_days) answer.push_back(i + 1);
}
return answer;
}
처음에 문자열을 파싱하여 vector에 저장을 해야되나..라고 생각하고 코드를 짜다가 더 효율적인 방법이 없을까 검색해보다, stringstream 클래스에 대해 알게 되었다.
기존에 익숙하게 사용했던 입,출력 스트림을 문자열에서도 사용할 수 있다는 것을 알게 되었고 이에 대해 추가적으로 공부하며 정리하였다.
https://dong-grae.tistory.com/120
stringstream
stringstream문자열을 마치 입력 스트림(cin)이나 출력 스트림(cout)처럼 사용할 수 있는 도구이다.문자열 조작이 필요한 작업에서 매우 유용하다.파싱: 문자열을 공백이나 특정 구분자를 기준으로 데
dong-grae.tistory.com
이 stringstream을 사용해 날짜 문자열을 매개변수로 전달 받아 총 일수를 계산해 반환하는 메서드를 만들었는데,기존에 구분 문자가 나타났을 때마다 string::substr로 나눠가며 파싱했던 방법보다 훨씬 간편하게 파싱할 수 있었다.
문자열을 파싱하며 문제를 해결해야되는 과정이 조금 더 수월해진 느낌이어서 만족도가 높았다.