나만의 작은 도서관
문제 150370. 개인정보 수집 유효기간 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/150370
난이도 : 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;
}
'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글
문제 172928. 공원 산책 (0) | 2024.06.26 |
---|---|
문제 178871. 달리기 경주 (0) | 2024.06.25 |
문제 161990. 바탕화면 정리 (0) | 2024.06.23 |
문제 118666. 성격 유형 검사하기 (0) | 2024.06.22 |
문제 133502. 햄버거 만들기 (0) | 2024.06.21 |