프로그래머스/lv1/150370. 개인정보 수집 유효기간 2023 KAKAO BLIND RECRUITMENT

SITY·2023년 9월 27일
0

Cpp_Algorithm

목록 보기
15/43

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

using namespace std;

int is_expired(string today, string p, int Validity) {
    int year = stoi(p.substr(0, 4));
    int month = stoi(p.substr(5, 2));
    int day = stoi(p.substr(8, 2));

    int year2 = stoi(today.substr(0, 4));
    int month2 = stoi(today.substr(5, 2));
    int day2 = stoi(today.substr(8, 2));

    int pToDays = (year * 12 * 28) + (month * 28) + day - 1 + Validity * 28;
    int tToDays = (year2 * 12 * 28) + (month2 * 28) + day2;
    
    return pToDays < tToDays ? 1 : 0;
}

vector<int> solution(string today, vector<string> terms, vector<string> p) {
    vector<int> answer;
    map<char, int> m;
    char alpha;
    int month;
    for (int i = 0; i < terms.size(); i++) {
        stringstream ss;
        ss.str(terms[i]);
        while (ss >> alpha >> month) m[alpha] = month;
    }
    for (int i = 0; i < p.size(); i++) 
        if (is_expired(today, p[i], m[p[i][11]]))
            answer.push_back(i + 1);

    return answer;
}

처음에 든 생각은 class를 만들어서 만료일까지 계산하여 인스턴스 멤버로 저장하려고 했는데, 그렇게 코딩을 하던 와중에 갑자기 든 생각이 있었다.
만약 그렇게 코딩을 한다면 반복문도 많이 돌 것이고, 직접 날짜를 더하고 빼는 과정에서 내림 올림 연산이 많아지기에 번거로워서 굳이 그렇게 해야하나 싶었다. 단순히 생각해보면 아래와 같다.

stringstream으로 공백 파싱 후 map에 알파벳 별 유효기간 terms를 정리한 후, 두 날짜를 일 수로 변환하고, 만료를 확인해야 하는 개인정보 p는 날짜 일수 개인정보 맨 뒷자리에 알파벳에 매핑되는 유효기간까지 더한 뒤에 두 숫자를 비교하면 되는 문제였다.

단순히 생각한 방식대로 구현해서 코드가 좀 더럽다. 이쁘게 정리해서 하려다가 코딩테스트는 시간이 생명이기에 패스했다.

profile
·ᴗ·

0개의 댓글