Deff_Dev

[프로그래머스] 개인정보 수집 유효기간 (C++) 본문

코딩테스트/프로그래머스

[프로그래머스] 개인정보 수집 유효기간 (C++)

Deff_a 2024. 3. 5. 14:22
 

프로그래머스

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

programmers.co.kr

문제

 

주어진 문제는 현재 날짜와 약관 별 유효기간(달), 개인정보 수집 일자가 입력되고,

이 정보를 비교하여 현재 날짜와 유효기간이 만료된 개인정보 수집 일자를 찾아 그 번호를 반환하는 문제이다.

 

문자열 파싱을 활용하여 구현하는 레벨 1의 문제였지만, 날짜 변환에 있어 예상치 못한 어려움이 있었다.

특히, 12월에서 1월로 넘어가는 경우와 연도가 변경되는 상황에서 문제가 발생했다.

 

처음에는 문자열끼리 비교하려고 했지만, 일부 테스트 케이스가 실패했다.

반례를 생각해봤고 12월에서 1월로 넘어가고 연도가 변경되는 부분이 문제임을 파악했다.

 

하지만 이 부분을 수정하는데 어려움이 있었다.

그래서 "문자열을 비교할 필요가 있을까?"라는 의문이 들어 다른 접근 방법을 모색했고,

년/월/일로 구성된 날짜를 각각의 숫자로 변환하여 날짜를 일로 표현하는 방법을 고안했다.

 

이를 통해 문제를 해결할 수 있었다.

풀이

#include <string>
#include <vector>
#include <map>
// https://school.programmers.co.kr/learn/courses/30/lessons/150370# 개인정보 수집 유효기간
using namespace std;

map <string,int> maps;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    
    // 현재 총 일수 구하기
    int t_Year = stoi(today.substr(0,4));
    int t_Month = stoi(today.substr(5,7));
    int t_Date = stoi(today.substr(8,today.length()));
    int t_Days = (t_Year * 12 * 28) + (t_Month * 28) + t_Date;
       
    // 약관 종류마다 유효기간 맵에 저장
    for(int i = 0; i<terms.size(); i++){               \
        string info = terms[i].substr(0,1);
        maps[info] = stoi(terms[i].substr(2,terms[i].length()));
    }
       
    // 각각의 개인 정보 총 만료일수 구하고 날짜가 지났는지 비교
    for(int i = 0; i<privacies.size(); i++){
        string info = privacies[i].substr(11,1); // 약관 종류
        int year = stoi(privacies[i].substr(0,4)); // 년도
        int month = stoi(privacies[i].substr(5,2)) + maps[ privacies[i].substr(11,1)]; // 월 + 약관 유효기간
        int date = stoi(privacies[i].substr(8,2)); // 일
        
        // 개인 정보 만료일 구하기
        int days = (year * 12 * 28) + (month * 28) + date;
        
        // 현재와 비교
        if(t_Days >= days){
            answer.push_back(i+ 1);
        }       
    }    
    return answer;
}

실패한 풀이

#include <string>
#include <vector>
#include <map>

using namespace std;

map <string,int> maps;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    int t_Year, t_Month, t_Date;
    
    // 현재 날짜 파싱
    t_Year = stoi(today.substr(0,4));
    t_Month = stoi(today.substr(5,7));
    t_Date = stoi(today.substr(8,today.length()));

    // 맵 저장
    for(int i = 0; i<terms.size(); i++){               \
        string info = terms[i].substr(0,1);
        maps[info] = stoi(terms[i].substr(2,terms[i].length()));
    }
    
    
    // 개인정보 유효 기간 비교
    for(int i = 0; i<privacies.size(); i++){
        string info = privacies[i].substr(11,1);
        string year, month;
        
        int date = stoi(privacies[i].substr(5,2)) + maps[info];
        // 이부분이 문제였다.
        year = to_string(stoi(privacies[i].substr(0,4)) + (date / 12));
        int x = date % 12;
        if(x < 10){
            month+= "0";
            if(x == 0) x = 1;         
        }        
        month += to_string(x);
             
        
        // 최종 유효 날짜
        string ymd = year + "." + month + "." + privacies[i].substr(8,2);
                
        // 문자열 비교
        if(today >= ymd){
            answer.push_back(i + 1);
        }        
    }

    
    return answer;
}