본문 바로가기
알고리즘/프로그래머스

[2023 Kakao] 개인정보 수집 유효기간

by 꾸준하곰 2023. 1. 9.

1. 해결방법

2. Solution 코드


1. 해결방법

문자열 관련 함수를 익히지 않은 탓으로 총 6시간이 소요되었다. (1차도전 - 1시간 20분) (2차도전 - 1시간 40분) (3차도전 - 3시간)

그리고 조건문이 아닌 산술연산을 통해 날짜를 비교함으로써 모든 테스트케이스를 해결했다. 

 

문제는 아래와 같이 해결하였다.

  • 주어진 문자열 vector<string> privacies를 1)개인정보 수집날짜 string pri_date, 2)개인정보 약관 종류 string pri_type으로 문자열을 나눠야 한다. (std::basic_string::substr() 함수 이용) 그리고 개인정보 약관 종류를 통해 vector<string> term 에서 매칭되는 약관 종류의 유효기간을 알 수 있다.
더보기

// std::basic_string::substr() 기본 사용법

string str;

string splited;

 

splited = str.substr(시작인덱스, 길이);      // 시작 인덱스에서 길이만큼 str 문자열을 나눈다.

  • 산술연산으로 날짜(연.월.일)를 숫자(연+월+일)로 표현할 수 있다.
  • 산술연산을 통한 날짜의 숫자 표현 예시는 다음과 같다. (2023.01.10  ->  679,757 일) *이때, 1달은 28일이라고 하자.
  • (2023년 * 12개월 * 28일) + (1월 * 28일) + (1일) = 679,757 일
  • 위의 방법으로 오늘날짜&만기날짜를 계산하여 비교함으로써 개인정보의 만기 여부를 확인할 수 있다.

 

그리고 문제해결과 별개로 요새 공부중인 lvalue 참조(Reference) 를 사용하여 함수의 매개변수를 표현했다

 

2. Solution 코드

/*
    2023.1.9 PM9:00 ~ 10:20     // strtok_s() 없는 오류
    
    2023.1.9 PM10:20 ~ 10:40    // std::cstring 확인
    2023.1.9 PM10:40 ~          // 미해결
    2023.1.10 PM9:20 ~ 2023.1.11 PM 12:10   // 해결
    
*/
#include <string>
#include <vector>
#include <algorithm>

#define ONEMONTH 28

using namespace std;


int today_y;
int today_m;
int today_d;


string get(string& date, int start, int end)
{
    string str;
    
    str = date.substr(start, end);
    if(str.front() == '0')
    {
        str.erase(str.begin(), str.begin() + 1);
    }
    
    return str;
}


void getToday(string& date)
{   
    today_y = stoi(date.substr(0, 4));
    today_m = stoi(get(date, 5, 2));
    today_d = stoi(get(date, 8, 2));
}


bool isExpired(vector<string>& term, string& privacy)
{
    int y, m, d;
    int type_term;
    
    
    // get 개인정보 수집 일자
    string pri_date = privacy.substr(0, 10);
    y = stoi(pri_date.substr(0, 4));
    m = stoi(get(pri_date, 5, 2));
    d = stoi(get(pri_date, 8, 2));
    
    
    // get 개인정보 약관 종류의 기간
    string pri_type = privacy.substr(11, 1);
    for(int i = 0; i < term.size(); i++)
    {
        if(term[i].front() == *pri_type.c_str())
        {
            type_term = stoi(term[i].substr(2));
        }
    }
    
    
    // 만기일 확인
    int exp = (y*12*ONEMONTH + m*ONEMONTH + d) - 1 + (type_term * ONEMONTH);
    int exp_y = exp / (12*ONEMONTH);
    int exp_m = (exp % (12*ONEMONTH)) / ONEMONTH;
    int exp_d = exp % ONEMONTH;

    
    // 만기 여부 확인
    if(today_y * 12 * ONEMONTH + today_m * ONEMONTH + today_d 
      > exp_y * 12 * ONEMONTH + exp_m * ONEMONTH + exp_d) return true;
    else return false;
}


vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;

    getToday(today);
    
    for(int i = 0; i < privacies.size(); i++)
    {
        if(isExpired(terms, privacies[i]) == true) 
        { 
            answer.push_back(i + 1);
        }
    }
    
    std::sort(answer.begin(), answer.end());
    
    return answer;
}

 

댓글