개인정보 수집 유효기간

2025. 3. 13. 10:02·코딩 테스트/프로그래머스

문제

문제 해석

1. 문자열 가지고 놀기다

2. terms를 map<char, int>로 하여 문자에 매칭되는 달수로 변환

3. today를 숫자 배열로 하여 나중에 날짜 비교할 때 써먹기

4. privacies에 들어있는 것들도 마지막 문자를 빼서 미리 더해줄 달 수로 변환해놓고 나머지 문자열로 이루어진 날짜를 구한다.

5. 구해진 날짜와 더해줄 달 수, 그리고 파기일자이므로 -1처리를 해준다.

6. 숫자 비교를 위해 today와 파기일자를 년+월+일로 이루어진 숫자로 변환하여 비교연산 후 넘어갔으면 정답 배열에 삽입

7. 정답 배열을 정렬하고 반환한다.

코드

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

using namespace std;

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

    map<char, int> TermsMap;
    char TermChar;
    for (string& Term : terms)
    {
        // Term에서 첫 글자 떼오기
        TermChar = Term[0];
        Term.erase(0, 2);
        TermsMap[TermChar] = stoi(Term);
    }

    // today를 숫자 배열로 변환    
    vector<int> Today;
    stringstream sstream = stringstream(today);
    string word;
    {
        while (getline(sstream, word, '.'))
        {
            Today.push_back(stoi(word));
        }
    }

    int NumOfInfo = static_cast<int>(privacies.size());

    bool bNeedErase = false;
    int ToEraseDay = 0;
    string Day;
    for (int IDX = 0; IDX < NumOfInfo; ++IDX)
    {
        Day = privacies[IDX];
        bNeedErase = false;
        TermChar = *(Day.end() - 1);
        int Month = TermsMap[TermChar];
        Day.erase(Day.end() - 1, Day.end());
        vector<int> ToEraseDay;
        {
            sstream = stringstream(Day);
            while (getline(sstream, word, '.'))
            {
                ToEraseDay.push_back(stoi(word));
            }

#define YEAR 0
#define MONTH 1
#define DAY 2

            ToEraseDay[MONTH] += Month;
            ToEraseDay[DAY] -= 1;

            // 일자 처리. 1일보다 작으면 달 수를 하나 빼야한다.
            if (ToEraseDay[DAY] < 1) { ToEraseDay[MONTH] -= 1; ToEraseDay[DAY] = 28; }
            // 달 처리. 12달보다 크다면 연 수를 증가시켜야 한다. 12보다 작아질때까지 반복한다.
            while (ToEraseDay[MONTH] > 12)
            {
                ToEraseDay[MONTH] -= 12;
                ++ToEraseDay[YEAR];
            }
        }

        if (Today[YEAR] * 10000 + Today[MONTH] * 100 + Today[DAY] > ToEraseDay[YEAR] * 10000 + ToEraseDay[MONTH] * 100 + ToEraseDay[DAY])
        {
            answer.push_back(IDX + 1);
        }
    }


    sort(answer.begin(), answer.end());

    return answer;
}

 

다른 사람의 풀이

1. 비슷하지만 더 심플하게 풀이했다.

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

예상 대진표  (0) 2025.05.28
달리기 경주  (0) 2025.03.24
바탕화면 정리  (0) 2025.03.11
성격 유형 검사하기  (0) 2025.03.10
둘만의 암호  (0) 2025.02.24
'코딩 테스트/프로그래머스' 카테고리의 다른 글
  • 예상 대진표
  • 달리기 경주
  • 바탕화면 정리
  • 성격 유형 검사하기
DevJoo1120
DevJoo1120
  • DevJoo1120
    Jin's Programming
    DevJoo1120
  • 전체
    오늘
    어제
    • 분류 전체보기 (142)
      • 포트폴리오 (7)
        • Castlevania: Aria of Sorrow.. (7)
        • [UE5] KILL Everything (0)
      • C++ (0)
      • 라이브러리 (1)
      • 다이렉트X11 (0)
      • Unreal Engine (11)
        • Unreal Document (1)
        • 이것 저것 (8)
        • UI (1)
      • 자료구조 및 알고리즘 (0)
      • 책 정리 (3)
        • 코딩 테스트 합격자 되기 C++ 편 (10)
      • 코딩 테스트 (32)
        • 프로그래머스 (32)
      • 스파르타 코딩 언리얼 1기 (9)
        • 특강 (0)
        • C++와 Unreal Engine으로 3D .. (2)
      • TIL(Today I Learned) (63)
      • 영어 공부 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이중 반복문
    WINAPI
    스파르타 코딩 클럽
    과제
    배열
    반복문
    정렬
    map
    문자열
    Study
    정리
    C++
    Unreal Engine 5
    코딩테스트
    팀 프로젝트
    Til
    코딩 테스트
    코딩 테스트 합격자 되기 c++ 편
    책 정리
    프로그래머스
  • hELLO· Designed By정상우.v4.10.5
DevJoo1120
개인정보 수집 유효기간
상단으로

티스토리툴바