나만의 작은 도서관

문제 150370. 개인정보 수집 유효기간 본문

프로그래머스 문제풀이/코드카타

문제 150370. 개인정보 수집 유효기간

pledge24 2024. 6. 24. 09:32

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

난이도 : Lv.1

 

문제 요약 설명

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다. 약관의 종류는 다음과 같습니다. 

약관 종류 유효기간
A 6 달
B 12 달
C 3 달

 

당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다. (모든 달은 28일까지 있다고 가정합니다.)이 때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

입력

  • 오늘 날짜를 의미하는 문자열 today
  • 약관의 유효기간을 담은 1차원 문자열 배열 terms
  • 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies

입력 제한

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

입력 예제

// input
"2022.05.19" // today
["A 6", "B 12", "C 3"] // terms
["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"] // privacies

// ans
[1, 3]

 

풀이 방식

 

다음과 같은 순서로 코드를 짰다.

1. 현재 날짜의 년/월/일을 분리하며 today_num배열에 저장한다.

  • ex. today = "2022.05.19", today_num = [2022, 05, 19]

2. 각 약관 종류의 이름, 유효기간을 map자료구조인 m에 저장한다.

  • ex. terms = ["A 6", "B 12", "C 3"] , m = {A: 6, B: 12, C: 3};

3. today_num, m에 저장된 데이터를 이용해 유효기간을 계산하고, 유효기간이 지난 개인정보의 번호를 answer에 추가한다. 대소 비교는 년/월/일이 하나로 합쳐진 문자열로 비교한다.

  • ex. 오늘 날짜 s1, 계산한 유효기간 s2일 때 s1 : s2 = 20220519 : 20211102
     => 만료되지 않은 개인 정보

 

정답 코드 

더보기
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <map>

using namespace std;

vector<string> today_num;

vector<string> getDate(string str){
    
    vector<string> temp_s(3);
    
    stringstream ss(str);
    
    getline(ss, temp_s[0], '.');
    getline(ss, temp_s[1], '.');
    getline(ss, temp_s[2], '.');
        
    return temp_s;
}

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    map<char, int> m;
    
    // 1. 현재 날짜의 년/월/일을 분리하며 today_num배열에 저장한다.
    today_num = getDate(today);
    
    // for(string s : today_num){
    //     cout << s << '\n';
    // }
    
    // 2. 각 약관 종류의 이름, 유효기간을 map자료구조인 m에 저장한다.
    string type_name, type_period;
    for(string s: terms){
        stringstream ss(s);
        ss >> type_name;
        ss >> type_period;
        
        m[type_name[0]] = stoi(type_period);
        //cout << type_name << " " << type_period << '\n';
    }
    
    // 3. today_num, m에 저장된 데이터를 이용해 유효기간을 계산하고, 유효기간이 지난 개인정보의 번호를 answer에 추가한다.
    string date_temp, type_temp;
    for(int i = 0; i < privacies.size(); i++){
        stringstream temp_ss(privacies[i]);
                
        temp_ss >> date_temp;
        temp_ss >> type_temp;
        
        vector<string> privacy_temp = getDate(date_temp);
        
        int cur_months = (stoi(privacy_temp[1]) + m[type_temp[0]]);  
        //cout << cur_months << '\n';
        privacy_temp[1] = to_string((cur_months-1) % 12 + 1);
        if(privacy_temp[1].size() == 1) privacy_temp[1] = "0" + privacy_temp[1];
        int carry = (cur_months-1) / 12;
        privacy_temp[0] = to_string(stoi(privacy_temp[0]) + carry);
        
        // for(string s : privacy_temp){
        //     cout << s << '\n';
        // }
        
        string s1 = today_num[0] + today_num[1] + today_num[2];
        string s2 = privacy_temp[0] + privacy_temp[1] + privacy_temp[2];
        
        // cout << s1 << " "<< s2 << '\n';
        
        if(s1 >= s2){
            answer.push_back(i+1);
        }
    }
    
    return answer;
}