TIL

3/23일자 TIL

오딘.L.스트레인지 2026. 3. 23. 20:23

코드카타-개인정보 수집 유효기간

💡 핵심 힌트: 날짜를 '일(Day)' 단위로 통일하기

가장 편한 방법은 모든 날짜를 (연도 * 12 * 28) + (월 * 28) + 일 형태의 정수로 변환하는 것입니다.

  1. 오늘 날짜 변환: today 문자열을 분석해 총 일수로 변환합니다.
  2. 약관 저장: std::map<char, int>을 사용하여 약관 종류별 유효기간(달 수 * 28일)을 저장합니다.
  3. 개인정보 확인: 각 privacies를 순회하며 수집 일자를 총 일수로 변환한 뒤, 해당 약관의 유효기간을 더합니다.
  4. 비교: (수집일 기반 만료일) <= 오늘 날짜라면 파기 대상입니다.
    • 문제에서 "2022.05.19까지 보관 가능"하고 오늘이 "2022.05.19"라면 아직 파기 대상이 아닙니다. 즉, 만료일이 오늘보다 작거나 같으면(Strictly before today) 파기해야 합니다.
#include <string>
#include <vector>
#include <sstream>
#include <map>

using namespace std;

// 날짜 문자열 "YYYY.MM.DD"를 총 일수로 변환하는 함수
int dateToDays(string date) {
    int y = stoi(date.substr(0, 4));
    int m = stoi(date.substr(5, 2));
    int d = stoi(date.substr(8, 2));
    return (y * 12 * 28) + (m * 28) + d;
}

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    
    // 1. 오늘 날짜를 일 단위로 변환
    int todayDays = dateToDays(today);
    
    // 2. 약관 정보를 Map에 저장 (Key: 약관종류, Value: 유효기간 일수)
    map<char, int> termMap;
    for (string term : terms) {
        stringstream ss(term);
        char type;
        int month;
        ss >> type >> month;
        termMap[type] = month * 28; // 달 수를 일 수로 변환
    }
    
    // 3. 개인정보를 하나씩 확인
    for (int i = 0; i < privacies.size(); i++) {
        // "2021.05.02 A" 형태 분리
        string dateStr = privacies[i].substr(0, 10);
        char type = privacies[i].back();
        
        int collectedDays = dateToDays(dateStr);
        int expiryDays = collectedDays + termMap[type];
        
        // 4. 오늘 날짜와 비교 (오늘 날짜가 만료일과 같거나 크면 파기)
        if (expiryDays <= todayDays) {
            answer.push_back(i + 1); // 번호는 1번부터 시작
        }
    }
    
    return answer;
}

 

 

 

분반 수업 내용

 

'TIL' 카테고리의 다른 글

3/20일자 TIL  (0) 2026.03.20
3/19일자 TIL  (0) 2026.03.19
3/18일자 TIL  (0) 2026.03.18
3월 17일자 TIL  (0) 2026.03.17
3/16일자 TIL  (0) 2026.03.16