[C++] 2023 KAKAO BLIND RECRUITMENT개인정보 수집 유효기간

2023. 5. 21. 14:24·[게임 개발] 알고리즘 공부/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

난이도 : Lv. 1

 

문제

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

 

입출력 예시

 

코드
#include <string>
#include <vector>

using namespace std;


vector<string> split(string input, string delimiter)
{
    vector<string> splitInput; // split한 문자열을 저장할 벡터

    // 구분자가 없을 때 까지 반복
    while (input.find(delimiter) != string::npos)
    {
        int delPos; // 구분자의 위치를 저장할 변수
        delPos = input.find(delimiter);

        splitInput.push_back(input.substr(0, delPos)); // 인덱스 0에서 delPos 만큼의 길이 추출
        input.erase(0, delPos + delimiter.size()); // 첫번째 문자부터 구분자까지 삭제
    }
    splitInput.push_back(input); // 남은 문자열 처리

    return splitInput;
}

int dateToNum(string date)
{
    vector<int> intDate; // int형으로 변환된 date를 담는 벡터
    int year, month, day;

    for (string splitDate : split(date, "."))
    {
        intDate.push_back(stoi(splitDate)); // intDate에 spliteDate를 int형으로 변환시켜 삽입
    }

    year = intDate[0];
    month = intDate[1];
    day = intDate[2];

    return (year * 12 * 28) + (month * 28) + (day);
}

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

    // 약관 종류, 유효기간 나누기
    vector<string> termsTypes;
    vector<string> termsDates;
    for (string tempTerms : terms)
    {
        vector<string> tempTermsSplit = split(tempTerms, " ");
        termsTypes.push_back(tempTermsSplit[0]);
        termsDates.push_back(tempTermsSplit[1]);
    }

    // 개인정보 수집 일자, 약관 종류 나누기
    vector<string> privaciesDates;
    vector<string> privaciesTerms;
    for (string tempPrivacies : privacies)
    {
        vector<string> tempPrivaciesSplit = split(tempPrivacies, " ");
        privaciesDates.push_back(tempPrivaciesSplit[0]);
        privaciesTerms.push_back(tempPrivaciesSplit[1]);
    }

    // 기간 만료 여부 확인
    for (int i = 0; i < privaciesDates.size(); i++)
    {
        int termsIndex;
        for (int findIndex = 0; findIndex < termsTypes.size(); findIndex++)
        {
            if (privaciesTerms[i] == termsTypes[findIndex])
                termsIndex = findIndex;
        }

        int termsNum = 28 * stoi(termsDates[termsIndex]);
        int endNum = dateToNum(privaciesDates[i]) + termsNum;

        if (todayNum >= endNum)
            answer.push_back(i + 1);
    }

    return answer;
}

 

풀이
vector<string> split(string input, string delimiter)
{
    vector<string> splitInput; // split한 문자열을 저장할 벡터

    // 구분자가 없을 때 까지 반복
    while (input.find(delimiter) != string::npos)
    {
        int delPos; // 구분자의 위치를 저장할 변수
        delPos = input.find(delimiter);

        splitInput.push_back(input.substr(0, delPos)); // 인덱스 0에서 delPos 만큼의 길이 추출
        input.erase(0, delPos + delimiter.size()); // 첫번째 문자부터 구분자까지 삭제
    }
    splitInput.push_back(input); // 남은 문자열 처리

    return splitInput;
}

먼저 입력받은 문자열을 구분자를 기준으로 나누는 split 함수의 구현부 입니다.

 

함수의 인자로, 나뉘게 될 문자열과 기준이 되는 구분자를 받습니다.

 

인자로 받은 문자열에서 find함수를 이용해 구분자가 있는지 찾습니다.

 

구분자를 찾지 못한다면 string::npos를 반환하므로 while문은 구분자가 없을때 까지 반복하는 반복문입니다.

 

delPos 변수에 find 함수를 이용해 구분자의 인덱스를 넣습니다.

그 후 substr 함수를 사용해서 0번째 인덱스 부터 delPos만큼 문자열에서 추출합니다.

 

추출한 문자열과 구분자 문자열은 erase를 이용해 삭제합니다.

 

더이상 구분자가 없으면 남은 문자열을 백터에 넣어서 처리합니다.

 

int dateToNum(string date)
{
    vector<int> intDate; // int형으로 변환된 date를 담는 벡터
    int year, month, day;

    for (string splitDate : split(date, "."))
    {
        intDate.push_back(stoi(splitDate)); // intDate에 spliteDate를 int형으로 변환시켜 삽입
    }

    year = intDate[0];
    month = intDate[1];
    day = intDate[2];

    return (year * 12 * 28) + (month * 28) + (day);
}

 

입력받은 문자열을 int형의 총 일자로 변환하는 dateToNum함수입니다.

함수의 인자로 yyyy.mm.dd 형식의 문자열을 받습니다.

 

입력받은 인자와 구분자 "."을 기준으로 split함수를 호출합니다.

그 후 나누어진 문자열들을 int형으로 변환합니다.

 

그 후 변환한 날짜들을 이용해 총 날짜를 계산합니다.

 

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

    // 약관 종류, 유효기간 나누기
    vector<string> termsTypes;
    vector<string> termsDates;
    for (string tempTerms : terms)
    {
        vector<string> tempTermsSplit = split(tempTerms, " ");
        termsTypes.push_back(tempTermsSplit[0]);
        termsDates.push_back(tempTermsSplit[1]);
    }

    // 개인정보 수집 일자, 약관 종류 나누기
    vector<string> privaciesDates;
    vector<string> privaciesTerms;
    for (string tempPrivacies : privacies)
    {
        vector<string> tempPrivaciesSplit = split(tempPrivacies, " ");
        privaciesDates.push_back(tempPrivaciesSplit[0]);
        privaciesTerms.push_back(tempPrivaciesSplit[1]);
    }

    // 기간 만료 여부 확인
    for (int i = 0; i < privaciesDates.size(); i++)
    {
        int termsIndex;
        for (int findIndex = 0; findIndex < termsTypes.size(); findIndex++)
        {
            if (privaciesTerms[i] == termsTypes[findIndex])
                termsIndex = findIndex;
        }

        int termsNum = 28 * stoi(termsDates[termsIndex]);
        int endNum = dateToNum(privaciesDates[i]) + termsNum;

        if (todayNum >= endNum)
            answer.push_back(i + 1);
    }

    return answer;
}

약관을 종류와 기간으로 나누기 위해 2개의 string형 벡터를 선언합니다.

이후 동일하게 개인정보를 가입일와 약관종류로 나누기 위해 2개의 string형 벡터를 선언합니다.

 

개인정보의 약관종류와 동일한 약관종류가 있는지 확인하기 위해 for문을 돌면서 termsTypes을 확인합니다.

동일한 약관이 존재하면 해당 약관의 인덱스를 저장합니다.

 termsTypes과 termsDates는 연관있는 데이터가 같은 인덱스를 가지고 있기 때문에 저장한 인덱스를 이용해

해당 약관타입에 해당하는 기간을 불러옵니다.

 

약관타입에 해당하는 기간과 가입한 날짜를 더한 값이 현재 날짜보다 작거나 같으면(약관 기간이 지났으면)

현재 인덱스가 기간만료 되었다고 판단하고 현재 인덱스를 결과값 벡터에 저장합니다.

저작자표시 (새창열림)

'[게임 개발] 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글

[C++] 완주하지 못한 선수  (0) 2023.07.07
[C++] 2021 카카오 채용연계형 인턴십 - 숫자 문자열과 영단어  (0) 2023.06.24
[C++] 2018 KAKAO BLIND RECRUITMENT[1차] 비밀지도  (0) 2023.06.23
[C++] 가장 가까운 같은 글자  (0) 2023.06.22
[C++] 2021 Dev-Matching: 웹 백엔드 개발자(상반기)로또의 최고 순위와 최저 순위  (0) 2023.05.19
'[게임 개발] 알고리즘 공부/프로그래머스' 카테고리의 다른 글
  • [C++] 2021 카카오 채용연계형 인턴십 - 숫자 문자열과 영단어
  • [C++] 2018 KAKAO BLIND RECRUITMENT[1차] 비밀지도
  • [C++] 가장 가까운 같은 글자
  • [C++] 2021 Dev-Matching: 웹 백엔드 개발자(상반기)로또의 최고 순위와 최저 순위
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      문자열
      dfs
      우선순위 큐
      메모리구조
      스레드
      context switching
      데드락
      역참조
      그리디
      누적합
      투포인터
      프로세스
      dp
      참조자
      해시
      브루트포스
      슬라이딩 윈도우
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    [C++] 2023 KAKAO BLIND RECRUITMENT개인정보 수집 유효기간
    상단으로

    티스토리툴바