본문 바로가기

programmers

프로그래머스 [2023 KAKAO BLIND RECRUITMENT / 개인정보 수집 유효기간](C++) -yes6686- 티스토리

728x90
SMALL

프로그래머스 문제 풀이: 개인정보 수집 유효기간


문제 링크: 문제 보기

문제 설명:

개인정보 수집일과 약관별 유효기간이 주어졌을 때, 현재 날짜를 기준으로 유효기간이 만료된 개인정보의 번호를 찾는 문제입니다. 날짜 계산 시, 모든 달을 28일로 고정하여 계산해야 합니다.


문제 해결 코드


#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int alpha[26]; // 각 약관의 유효기간 저장

// 날짜를 일(day) 단위로 변환하는 함수
int convertToDays(string date) {
    istringstream s(date);
    string sb;
    int i = 1, totalDays = 0;
    while (getline(s, sb, '.')) {
        if (i == 1) totalDays += stoi(sb) * 28 * 12; // 연도 변환
        else if (i == 2) totalDays += stoi(sb) * 28; // 월 변환
        else totalDays += stoi(sb); // 일 변환
        i++;
    }
    return totalDays;
}

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    int todayDays = convertToDays(today); // 현재 날짜 변환

    // 약관별 유효기간 저장
    for (string& term : terms) {
        istringstream ss(term);
        string key, value;
        ss >> key >> value;
        alpha[key[0] - 'A'] = stoi(value) * 28; // 약관 기간을 일 단위로 변환
    }

    // 개인정보 만료 여부 확인
    for (int i = 0; i < privacies.size(); i++) {
        istringstream ss(privacies[i]);
        string date, term;
        ss >> date >> term;
        
        int privacyDate = convertToDays(date); // 개인정보 수집일 변환
        int validPeriod = alpha[term[0] - 'A']; // 약관에 따른 유효기간

        if (privacyDate + validPeriod - 1 < todayDays) { // 만료 확인
            answer.push_back(i + 1);
        }
    }

    return answer;
}

코드 설명

  • 핵심 알고리즘: 모든 날짜를 일(day) 단위로 변환하여 비교합니다. 약관별 유효기간을 고려하여 만료된 개인정보를 찾습니다.
  • 구현 세부사항:
    • convertToDays 함수는 날짜를 연*28*12 + 월*28 + 일 형태로 변환하여 비교를 단순화합니다.
    • 약관 정보를 alpha 배열에 저장하여 빠르게 유효기간을 가져올 수 있도록 처리합니다.
    • 개인정보 수집일 + 유효기간 - 1이 오늘 날짜보다 작으면 만료된 것으로 판단합니다.
  • 시간 복잡도 분석:
    • 날짜 변환: O(1)
    • 약관 저장: O(t), 여기서 t는 약관 개수
    • 개인정보 확인: O(p), 여기서 p는 개인정보 개수
    • 총 시간 복잡도: O(t + p)

결과

이 코드는 모든 날짜를 일(day) 단위로 변환하여 간단한 비교 연산만으로 개인정보의 만료 여부를 확인합니다. 빠르고 직관적인 방식으로 해결하였습니다.

다른 접근 방식으로는 연, 월, 일을 따로 비교하여 연산하는 방법도 있지만, 날짜를 일 단위로 변환하는 것이 비교를 훨씬 간단하게 만들어줍니다.

728x90
LIST