📍문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/150370
📍알고리즘 분류
- 구현
📍문제 풀이
- 약관 A, B, C 에 따라 각각 유효 개월 수가 자연수로 주어진다
- 최초 개인정보 수집 일자가 2021.05.02 처럼 문자열로 주어지고, 어떤 약관 종류인지 주어진다
- 오늘 날짜가 2021.05.02 처럼 문자열로 주어진다
이 때, 각 개인정보 수집 일자에 대해서, 약관의 개월 수에 따라 오늘 시점에서 파기해야 할 수집 일자 번호를 반환한다
1. 최초 개인정보 수집일자에다 유효 개월 수를 더해 최대 보유 가능 일자를 구한다
2. 최대 보유 가능 일자가 오늘 날짜보다 작으면 파기해야 하므로 결과에 추가한다
주의할 점
오늘은 2022년 7월인데, 최대 보유 가능 일자가 23년 5월일 경우, 월 비교에서 잘못 판단하는 것을 막기 위해,
월 비교할 때는 연도가 동일하다고 해줘야 한다
마찬가지로, 일자를 비교할 때도, 연월이 동일하다고 해줘야 한다
📍코드 (JavaScript)
const today = "2020.01.01";
const terms = ["Z 3", "D 5"];
const privacies = [
"2019.01.01 D",
"2019.11.15 Z",
"2019.08.02 D",
"2019.07.01 D",
"2018.12.28 Z",
];
function solution(today, terms, privacies) {
const answer = [];
const [todayYear, todayMonth, todayDay] = today.split(".").map(Number);
const termObj = getTermMonths(terms);
for (let i = 0; i < privacies.length; i++) {
const [date, term] = privacies[i].split(" ");
const [plusYear, plusMonth] = getYearAndMonth(termObj[term]);
if (isExpired(date, plusYear, plusMonth, todayYear, todayMonth, todayDay))
answer.push(i + 1);
}
return answer;
// 약관에 따른 허용 개월 수 찾는 객체
function getTermMonths(terms) {
const obj = {};
terms.forEach((term) => {
const [termName, termMonths] = term.split(" ");
obj[termName] = +termMonths;
});
return obj;
}
// 초과 개월 수를 연 월로 환산
function getYearAndMonth(month) {
const validYear = Math.floor(month / 12);
const validMonth = month % 12;
return [validYear, validMonth];
}
// 유효기간 만료 검사하는 함수
function isExpired(
date,
plusYear,
plusMonth,
todayYear,
todayMonth,
todayDay,
) {
const [dateYear, dateMonth, dateDay] = date.split(".").map(Number);
let validYear = dateYear + plusYear;
let validMonth = dateMonth + plusMonth;
if (dateMonth + plusMonth > 12) {
validYear++;
validMonth -= 12;
}
if (validYear < todayYear) return true;
// validear > todayYear 인데 validMonth < todayMonth 인 경우를 배제하기 위해
// 이퀄 조건을 추가한다
if (validYear === todayYear && validMonth < todayMonth) return true;
// 일자를 비교할 때도, 모두 같은 경우일 때만 답으로 인정해야 함
if (
validYear === todayYear &&
validMonth === todayMonth &&
dateDay <= todayDay
)
return true;
return false;
}
}
console.log(solution(today, terms, privacies));