-
[프로그래머스][2023 KAKAO BLIND RECRUITMENT]개인정보 수집 유효기간(C++)2024년 01월 13일
- 유니얼
-
작성자
-
2024.01.13.:11
728x90안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "개인정보 파기하기" 문제를 해결하는 방법에 대해 설명하려고 합니다. 이 문제는 약관에 따라 보관 중인 개인정보의 유효기간을 확인하고, 오늘 날짜를 기준으로 파기해야 할 개인정보의 번호를 찾는 문제입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.
문제링크 :
https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 개요
주어진 문제에서는 여러 약관에 따라 수집된 개인정보와 각 약관의 유효기간이 주어집니다. 개인정보는 약관에 따라 일정 기간 동안 보관 가능하며, 유효기간이 지나면 반드시 파기해야 합니다. 오늘 날짜를 기준으로 유효기간이 지난 개인정보의 번호를 찾아내는 것이 문제입니다.
문제 해결 방법
이 문제를 해결하기 위해서는 다음과 같은 단계를 따라갑니다.
- 각 약관의 이름과 유효기간을 매칭시키기 위해 terms 배열을 사용하여 term_map 맵을 생성합니다. 또한, 약관의 이름과 약관의 인덱스를 매칭시키기 위해 term_index 맵을 생성합니다.
- 각 개인정보의 정보를 확인하고, 개인정보가 유효기간을 넘어섰는지 여부를 판단합니다. 이를 위해 개인정보 배열 privacies를 순회하면서 다음을 수행합니다.
- 모든 개인정보를 확인한 후, answer 배열을 반환합니다.
코드 구현
문제를 해결하기 위한 코드는 다음과 같습니다. C++을 사용하여 작성되었으며, 주석을 통해 코드의 각 부분을 설명하였습니다.
#include <string> #include <vector> #include <bits/stdc++.h> using namespace std; // 약관과 유효기간을 매칭시키는 맵 map<string, int> term_map; // 약관 이름과 약관의 인덱스를 매칭시키는 맵 map<string, int> term_index; // 문자열을 특정 구분자(del)를 기준으로 분리하여 벡터로 반환하는 함수 vector<string> Split(string input, string del) { vector<string> ret; int pos; string token; while ((pos = input.find(del)) != string::npos) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos + del.length()); } ret.push_back(input); return ret; } // 문자열을 두 개의 구분자(del1, del2)로 분리하여 벡터로 반환하는 함수 vector<string> Split2(string input, string del1, string del2) { vector<string> ret; int pos; string token; while (((pos = input.find(del1)) != string::npos)) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos + del1.length()); } while (((pos = input.find(del2)) != string::npos)) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos + del2.length()); } ret.push_back(input); return ret; } // 주어진 정보를 기반으로 개인정보 파기 여부를 판단하는 함수 vector<int> solution(string today, vector<string> terms, vector<string> privacies) { vector<int> answer; // 오늘 날짜를 "." 구분자를 이용하여 분리 vector<string> todays = Split(today, "."); // 약관과 유효기간을 매칭시키는 맵을 생성 for (int i = 0; i < terms.size(); i++) { vector<string> temp = Split(terms[i], " "); term_map[temp[0]] = atoi(temp[1].c_str()); // 약관과 유효기간을 매핑 term_index[temp[0]] = i + 1; // 약관 이름과 인덱스를 매핑 } // 개인정보를 확인하고 유효기간을 검사 for (int i = 0; i < privacies.size(); i++) { vector<string> days = Split2(privacies[i], ".", " "); int term_day = term_map[days[3]] * 28; // 약관의 유효기간을 일수로 변환 // 오늘 날짜와 개인정보 수집일자를 비교하여 유효기간을 초과했는지 여부를 판단 int y = atoi(todays[0].c_str()) - atoi(days[0].c_str()); int m = (atoi(todays[1].c_str()) - atoi(days[1].c_str())); if (m < 0) { m += 12; } int d = atoi(todays[2].c_str()) - atoi(days[2].c_str()); if (d < 0) { d += 28; } if (term_day <= (((y * 12) + m) * 28) + d) { answer.push_back(i + 1); // 유효기간 초과한 개인정보의 번호를 저장 } } return answer; }
결과 및 시간 복잡도
주어진 예제에 대한 결과를 확인하면 문제를 정확하게 해결하는 것을 확인할 수 있습니다. 이 알고리즘의 시간 복잡도는 입력으로 주어진 privacies 배열의 길이에 비례하며, 모든 개인정보를 확인하므로 최악의 경우에도 privacies 배열의 길이만큼의 연산을 수행합니다. 따라서 시간 복잡도는 O(N)이며, N은 privacies 배열의 길이입니다.
반응형다음글이전글이전 글이 없습니다.댓글