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 및 개인정보수집일자를 계산 가능한 날짜로 변경하기