1. 해결방법
2. Solution 코드
1. 해결방법
문자열 관련 함수를 익히지 않은 탓으로 총 6시간이 소요되었다. (1차도전 - 1시간 20분) (2차도전 - 1시간 40분) (3차도전 - 3시간)
그리고 조건문이 아닌 산술연산을 통해 날짜를 비교함으로써 모든 테스트케이스를 해결했다.
문제는 아래와 같이 해결하였다.
- 주어진 문자열 vector<string> privacies를 1)개인정보 수집날짜 string pri_date, 2)개인정보 약관 종류 string pri_type으로 문자열을 나눠야 한다. (std::basic_string::substr() 함수 이용) 그리고 개인정보 약관 종류를 통해 vector<string> term 에서 매칭되는 약관 종류의 유효기간을 알 수 있다.
더보기
// std::basic_string::substr() 기본 사용법
string str;
string splited;
splited = str.substr(시작인덱스, 길이); // 시작 인덱스에서 길이만큼 str 문자열을 나눈다.
- 산술연산으로 날짜(연.월.일)를 숫자(연+월+일)로 표현할 수 있다.
- 산술연산을 통한 날짜의 숫자 표현 예시는 다음과 같다. (2023.01.10 -> 679,757 일) *이때, 1달은 28일이라고 하자.
- (2023년 * 12개월 * 28일) + (1월 * 28일) + (1일) = 679,757 일
- 위의 방법으로 오늘날짜&만기날짜를 계산하여 비교함으로써 개인정보의 만기 여부를 확인할 수 있다.
그리고 문제해결과 별개로 요새 공부중인 lvalue 참조(Reference) 를 사용하여 함수의 매개변수를 표현했다
2. Solution 코드
/*
2023.1.9 PM9:00 ~ 10:20 // strtok_s() 없는 오류
2023.1.9 PM10:20 ~ 10:40 // std::cstring 확인
2023.1.9 PM10:40 ~ // 미해결
2023.1.10 PM9:20 ~ 2023.1.11 PM 12:10 // 해결
*/
#include <string>
#include <vector>
#include <algorithm>
#define ONEMONTH 28
using namespace std;
int today_y;
int today_m;
int today_d;
string get(string& date, int start, int end)
{
string str;
str = date.substr(start, end);
if(str.front() == '0')
{
str.erase(str.begin(), str.begin() + 1);
}
return str;
}
void getToday(string& date)
{
today_y = stoi(date.substr(0, 4));
today_m = stoi(get(date, 5, 2));
today_d = stoi(get(date, 8, 2));
}
bool isExpired(vector<string>& term, string& privacy)
{
int y, m, d;
int type_term;
// get 개인정보 수집 일자
string pri_date = privacy.substr(0, 10);
y = stoi(pri_date.substr(0, 4));
m = stoi(get(pri_date, 5, 2));
d = stoi(get(pri_date, 8, 2));
// get 개인정보 약관 종류의 기간
string pri_type = privacy.substr(11, 1);
for(int i = 0; i < term.size(); i++)
{
if(term[i].front() == *pri_type.c_str())
{
type_term = stoi(term[i].substr(2));
}
}
// 만기일 확인
int exp = (y*12*ONEMONTH + m*ONEMONTH + d) - 1 + (type_term * ONEMONTH);
int exp_y = exp / (12*ONEMONTH);
int exp_m = (exp % (12*ONEMONTH)) / ONEMONTH;
int exp_d = exp % ONEMONTH;
// 만기 여부 확인
if(today_y * 12 * ONEMONTH + today_m * ONEMONTH + today_d
> exp_y * 12 * ONEMONTH + exp_m * ONEMONTH + exp_d) return true;
else return false;
}
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
getToday(today);
for(int i = 0; i < privacies.size(); i++)
{
if(isExpired(terms, privacies[i]) == true)
{
answer.push_back(i + 1);
}
}
std::sort(answer.begin(), answer.end());
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] MySQL - JOIN 보호소에서 중성화 한 동물 (0) | 2022.04.09 |
---|---|
[프로그래머스] SQL - JOIN 오랜 기간 보호한 동물(1) (0) | 2022.04.09 |
[프로그래머스] MySQL - JOIN 있었는데요 없었습니다 (0) | 2022.04.09 |
[프로그래머스] MySQL - JOIN 없어진 기록 찾기 (0) | 2022.04.09 |
[프로그래머스] 완전탐색 - 모의고사 (0) | 2022.04.03 |
댓글