Programmers '개인정보 수집 유효 기간' 문제 보러가기
각 약관 유형 별 유효 기간을 탐색하기 좋게 저장해두고,
주어진 날짜 문자열을 계산하기 좋게 '일' 단위로 변환한 뒤 유효 일자와 주어진 오늘 날짜를 비교했다.
function makeElementToNum(arr){
let result = [];
for(let i=0;i<arr.length;i++){
result.push(+arr[i]);
}
return result;
}
function countDays(date){
let days = 0;
let dateNum = makeElementToNum(date);
for(let i=0;i<dateNum.length;i++){
days+=dateNum[i];
}
return ((dateNum[0]-1)*336 + (dateNum[1]-1)*28 + dateNum[2]);
}
function solution(today, terms, privacies) {
var answer = [];
// 각 유형 별 유효 기간을 저장한다
// 유효 기간은 1 이상 100 이하임을 주의.
const expiration = {};
terms.map((term)=>{
expiration[term.slice(0,1)] = Number(term.slice(2,5));
});
// privacies 배열을 순회한다
// 각 개인 정보의 약관 종류에 따라 유효 일자 계산한다
// 유효 일자 = 개인 정보 수집 일자 + 유효 기간
// 유효 일자 < 오늘 날짜라면 정답 배열에 추가한다.
privacies.map((privacy,i)=>{
const date = privacy.slice(0,10).split(".");
const type = privacy.slice(11,12);
const validDays = countDays(date) + expiration[type]*28-1;
const todayDays = countDays(today.split("."));
if(validDays < todayDays){
answer.push(i+1);
}
});
return answer;
}
*hyunmo 님의 코드를 참고하였습니다.
1. makeElementToNum()
대신 Number
를 callback 함수로 넘겨주어 숫자로 변환
2. slice()
가 아닌 ' '
단위로 split()
하여 다양한 길이의 유효 기간 커버
3. 구조 분해 할당을 통한 가독성 높은 코드
📌 구조 분해 할당
; 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식이다.
- 분해한 값이 undefined일 때 대신 사용할 수 있는 기본 값을 할당할 수 있다 : [a=5, b=7] = [1]; // a는 1 b는 7
- 임시 변수 없이 두 변수의 값을 교환할 수 있다 : [a,b] = [b,a]
- 불필요한 반환 값을 무시할 수 있다 : var [a, , b] = f();
function countDays(date){
return ((date[0]-1)*12*28 + (date[1]-1)*28 + date[2]);
}
function solution(today, terms, privacies) {
var answer = [];
const todayDays = countDays(today.split(".").map(Number));
const expiration = {};
terms.map((term)=>{
let [type, duration] = term.split(" ");
expiration[type] = Number(duration);
});
privacies.map((privacy,i)=>{
let [date, type] = privacy.split(" ");
date = date.split(".").map(Number);
const validDays = countDays(date) + expiration[type]*28-1;
if(validDays < todayDays){
answer.push(i+1);
}
});
return answer;
}