프로그래머스_개인정보 수집 유효기간

와다닥·2023년 1월 17일
0

[C++] 문제풀기

목록 보기
7/7
post-custom-banner

코딩테스트 연습 > 2023 KAKAO BLIND RECRUITMENT > 개인정보 수집 유효기간

나의 야망은 아래와 같았다.

  • terms에서 개월수를 읽어오고 미리 계산을 해둠.
  • privacies에서 약관 종류를 확인하고 계산해둔 날짜를 불러옴.
  • privacies의 수집일자가 계산해둔 날짜 이전이면 파기 목록에 올림.

그렇게 나온 것

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

using namespace std;

string calc_date(string today, string term_months) {
    int tm = stoi(term_months), 
        tm_y = tm / 12, 
        tm_m = tm % 12,
        td_y = stoi(today.substr(0, 4)), 
        td_m = stoi(today.substr(4, 2)), 
        td_d = stoi(today.substr(6));
    td_m -= tm_m;
    td_y -= tm_y;
    if (td_d == 1) { td_d = 28; --td_m; }
    if (td_m < 1) { td_m += 12; --td_y; }
    
    return to_string(td_y) + "." + (td_m < 10 ? "0" + td_m : to_string(td_m)) + "." + (td_d < 10 ? "0" + td_d : to_string(td_d));
}

bool compare_date(string pr_date, string tm_date) {
    int pr_y = stoi(pr_date.substr(0, 4)), 
        pr_m = stoi(pr_date.substr(4, 2)), 
        pr_d = stoi(pr_date.substr(6)),
        tm_y = stoi(tm_date.substr(0, 4)), 
        tm_m = stoi(tm_date.substr(4, 2)), 
        tm_d = stoi(tm_date.substr(6));
    
    if (pr_y < tm_y) return true;
    else if (pr_y > tm_y) return false;
    else if (pr_m < tm_m) return true;
    else if (pr_m > tm_m) return false;
    else if (pr_d < tm_d) return true;
    else return false;
}

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    
    map<char, string> terms_map;
    for (int i = 0; i < terms.size(); ++i) {
        terms_map.insert({terms[i][0], calc_date(today, terms[i].substr(2))});
    }
    
    for (int i = 0; i < privacies.size(); ++i) {
        if (compare_date(privacies[i].substr(0, 11), terms_map.find(privacies[i][11])->second)) answer.push_back(i + 1);
    }
    
    return answer;
}

그리고 그것의 결과:

signal: aborted (core dumped)
테스트 결과 (~˘▾˘)~
2개 중 0개 성공

ㅋㅋ 어림도 없지


코드도 코드인데 그것보다 더 기초적인 바보짓을 했다
substr을 사용한 곳에서 index 지정을 잘못한 바람에 모든 것이 꼬였기 때문이었다...


개선한 풀이

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

using namespace std;

bool isExpired(int months, string today, string pv_day) {
    int t_y = stoi(today.substr(0, 4)), 
        t_m = stoi(today.substr(5, 2)), 
        t_d = stoi(today.substr(8)),
        pv_y = stoi(pv_day.substr(0, 4)), 
        pv_m = stoi(pv_day.substr(5, 2)), 
        pv_d = stoi(pv_day.substr(8));
    long long td = t_d + t_m * 28 + t_y * 12 * 28, 
        pv = pv_d + pv_m * 28 + pv_y * 12 * 28;
    if (td - pv <= months * 28 - 1) return false;
    return true;
}

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    map<char, int> terms_map;
    for (int i = 0; i < terms.size(); ++i) {
        terms_map.insert(make_pair(terms[i][0], stoi(terms[i].substr(2))));
    }

    for (int i = 0; i < privacies.size(); ++i) {
        char term_code = terms_map.at(privacies[i][11]);
        if (isExpired(term_code, today, privacies[i].substr(0, 10))) answer.push_back(i + 1);
    }

    return answer;
}

연월일을 모두 일로 환산해서 차를 비교했더니 정상적으로 동작했는데 정리한 것 치고 많이 지저분하다.
더 정리할 수 있는 방법을 찾아봐야겠다...

profile
I can't die I'm ALL IN
post-custom-banner

0개의 댓글