Algorithm
[프로그래머스 level1] 개인정보 수집 유효기간 C++
유자바
2024. 10. 1. 20:26
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 1️⃣ - 오답
// 입력: 약관 종류 arr[i] | 약관 유효기간 terms[i]
// 입력: 번호 n | 오늘 날짜 today | 약관 종류 string -> 개인정보수집날짜+약관종류 privacies[i]
// 출력: 파기해야하는 개인정보의 번호
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
// today: 2022.05.19
// term: 약관 종류 + " " + 유효기간 (예) A 6
// privacies: 개인 정보 수집 일자 + " " + 약관 종류 (예) 2021.05.02 A
// 1. term에 저장된 약관 종류, 유효기간 정보 분리한 데이터 term_kind, term_deadline vector 만들기 (기준은 인덱스)
// 2. privacies에 저장된 개인 정보 수집 일자, 약관 종류 정보 분리한 데이터 privacies_date, privacies_kind vector 만들기 (기준은 인덱스)
// 3. privacies_kind 데이터를 terms_kind와 비교하고 같은 데이터가 있으면
// 4. int(term_deadline 데이터 + privacies_date 데이터) > today 라면, answer에 저장
vector<string> terms_kind;
vector<int> terms_deadline;
for (int i=0;i<terms.size();i++){
terms_kind[i] = terms[i].substr(0,terms[i].find(" "));
terms_deadline[i] = stoi(terms[i].substr(terms[i].find(" ")+1, terms[i].length()));
}
vector<string> privacies_date;
vector<string> privacies_kind;
for (int i=0;i<privacies.size();i++){
privacies_date[i] = privacies[i].substr(0,privacies[i].find(" "));
privacies_kind[i] = privacies[i].substr(privacies[i].find(" ")+1, privacies[i].length());
}
for (int i=0;i<privacies.size();i++){
for (int j=0;j<terms.size();j++){
if (privacies_kind[i] == terms_kind[j]){
remove(privacies_date[i].begin(), privacies_date[i].end(), " ");
remove(today.begin(), today.end(), " ");
int deadline = terms_deadline[i] * 100;
int date = stoi(privacies_date[i]);
int t = stoi(today);
if (t > date + deadline){
answer.push_back(i+1);
}
}
}
}
return answer;
}
30분 동안 문제를 읽고, 이해하고, 해결해 보았다. 문제를 읽는데 생각보다 많은 시간을 소요해서 어떤 자료구조를 사용할지 충분히 고민하지 못해 vector만 사용했다. 결론적으로 내 스스로 문제를 풀면서 많은 벡터들로 인해 혼동이 많았고, 데이터의 자료형으로 인해 문제를 해결하지 못했다.
풀이 2️⃣ - 정답
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
// today 날짜 계산하기
// 약관 map에 저장하기
// 프라이버시 날짜 계산하기
// today와 프라이버시 날짜 비교하기
// today 날짜 계산하기 2024.09.30
int t_year = stoi(today.substr(0,4));
int t_month = stoi(today.substr(5,7));
int t_day = stoi(today.substr(8,10));
int t_date = t_year * 12 * 28 + (t_month - 1) * 28 + t_day;
// 약관 map에 저장하기 A 6
map <char, int> m;
for(int i = 0; i < terms.size(); i++){
stringstream ss(terms[i]);
char key; int value;
ss >> key >> value;
m[key] = value;
}
// 프라이버시 날짜 계산하기
vector <int> priv;
for(int i = 0; i < privacies.size(); i++){
int p_year = stoi(privacies[i].substr(0, 4));
int p_month = stoi(privacies[i].substr(5, 2));
int p_day = stoi(privacies[i].substr(8, 2));
char a = privacies[i].back();
int p_date = p_year * 12 * 28 + (p_month - 1) * 28 + p_day + (m[a] * 28 - 1);
priv.push_back(p_date);
}
// 비교
for(int i = 0; i < priv.size(); i++){
if(priv[i] < t_date){
answer.push_back(i + 1);
}
}
return answer;
}
풀이1에서 바뀐 점은
- today 날짜와 프라이버시 날짜를 계산할 때 공백 제거 혹은 온점 제거가 아닌 날짜를 계산하는 수식으로 바꾸었다.
- 또한 약관의 종류와 약관의 기한을 map 데이터구조를 사용해 정리했고, 내가 원하는 자료형으로 데이터를 추출하기 위해 stringstream을 사용했다.
이 문제의 핵심은 두 가지이다.
1. 주어진 데이터를 입맛에 맞게 변경하기 -> terms, privacies 데이터를 substr를 사용해 추출
2. today 및 개인정보수집일자를 계산 가능한 날짜로 변경하기