-
[프로그래머스][2023 KAKAO BLIND RECRUITMENT]개인정보 수집 유효기간(C++)2024년 01월 13일
- 유니얼
-
작성자
-
2024.01.13.:11
728x90안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "개인정보 파기하기" 문제를 해결하는 방법에 대해 설명하려고 합니다. 이 문제는 약관에 따라 보관 중인 개인정보의 유효기간을 확인하고, 오늘 날짜를 기준으로 파기해야 할 개인정보의 번호를 찾는 문제입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.
문제링크 :
https://school.programmers.co.kr/learn/courses/30/lessons/150370
문제 개요
주어진 문제에서는 여러 약관에 따라 수집된 개인정보와 각 약관의 유효기간이 주어집니다. 개인정보는 약관에 따라 일정 기간 동안 보관 가능하며, 유효기간이 지나면 반드시 파기해야 합니다. 오늘 날짜를 기준으로 유효기간이 지난 개인정보의 번호를 찾아내는 것이 문제입니다.
문제 해결 방법
이 문제를 해결하기 위해서는 다음과 같은 단계를 따라갑니다.
- 각 약관의 이름과 유효기간을 매칭시키기 위해 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 배열의 길이입니다.
반응형다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드
받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이
감지되어도 모달 창이 표시되지 않습니다.)