나의 풀이
요약 하면 간단하다. 현재 보관되어있는 개인정보 수집 일자를 약관 종류에 따라 유효기간 만료일을 알아내서 오늘을 기준으로 만료일이 지났다면 폐기하면 된다.
바로 Date를 사용하면 조금 더 편리하겠다라고 생각해서 적용시켰다.
1. today를 new Date에 넣어준다. (구분자가 "-" 여야 ISO 8601 표준에 따라 날짜를 표기한다)
today = new Date(today.replace(/[.]/g,"-"))
2. terms를 약관 종류에 따라 해당 유효기간을 알 수 있도록 객체로 변경하기 ( key: 약관 종류, value : 유효기간)
function convertArrayToObject(terms) {
return terms.reduce((acc, cur) => {
const [type, month] = cur.split(" ")
acc[type] = month
return acc
},{})
}
3. privacies를 순회하면서 약관 종류에 따라 유효기간이 만료되었으면 해당 index + 1을 새로운 배열에 넣기
3-1-1. privacies 배열은 아래와 같이 생겼다.
["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
3-1-2. 이를 구조분해할당을 사용해서 date와 type으로 나눈다.
const [date, type] = cur.split(" ")
3-1-3. date를 new Date에 넣어준다. (구분자가 "-" 여야 ISO 8601 표준에 따라 날짜를 표기한다)
const joinDate = new Date(date.replace(/[.]/g,"-"))
3-1-4. setMonth 메서드를 사용해서 타입에 맞는 month 추가해서 계산
joinDate.setMonth(joinDate.getMonth() + +updatedTerms[type])
3-2. expirationDate, today를 비교해서 만료되었으면 index + 1 ( 0번째 개인정보가 시작이 아니라 첫 번째 개인정보가 시작)
if(isExpired(expirationDate, today)) acc.push(index + 1)
전체코드
function solution(today, terms, privacies) {
today = new Date(today.replace(/[.]/g,"-"))
const convertedTerms = convertArrayToObject(terms)
return privacies.reduce((acc,currentPrivacy,index) => {
const expiryDate = getExpirationDate(currentPrivacy, convertedTerms)
if(isExpired(expiryDate, today)) acc.push(index + 1)
return acc
},[])
}
function convertArrayToObject(terms) {
return terms.reduce((acc, term) => {
const [type, month] = term.split(" ")
acc[type] = month
return acc
},{})
}
function getExpirationDate(currentPrivacy, convertedTerms) {
const [date, type] = currentPrivacy.split(" ")
const joinDate = new Date(date.replace(/[.]/g,"-"))
joinDate.setMonth(joinDate.getMonth() + +convertedTerms[type])
return joinDate
}
function isExpired(expiryDate, today) {
return expiryDate <= today
}
후기
Date에 대해 더 공부해야겠다. 생각보다 모르는 부분이 많았다.
다른 사람 풀이
다르게 접근하는 방법이 있어서 가져왔다.
예를 통해서 아래 코드를 알아보자.
A 약관의 유효기간 : 6 개월
개인 정보 수입일자 : 2021.05.02
약관 종류 : A
오늘 날짜가 2022.05.19 라고 해보자.
1. 먼저 A 약관의 유효기간을 일로 바꾼다.
term * 28 = 168
2. 개인 정보 수집 일자를 일로 변환한다.
2021 * 12 * 28 + 5 * 28 + 2 = 679,198
3. 오늘 날짜를 일로 변환한다.
2022 * 12 * 28 + 5*28 + 19 = 679,551
4. 위에 변환한 일수를 바탕으로 계산을 해준다.
오늘 날짜 - 개인 정보 수집 만료일 >= 해당 타입의 유효기간 일수 일때 acc.push(i + 1)
679,551 - 679,198 >= 168 => true
function solution(today, terms, privacies) {
const map = new Map();
for (let i = 0; i < terms.length; i++) {
const [type, term] = terms[i].split(' ');
map.set(type, term * 28);
}
return privacies.reduce((acc, curr, i) => {
const [date, type] = curr.split(' ');
const [cy, cm, cd] = date.split('.');
const [ty, tm, td] = today.split('.');
const currentDays = +cy * 12 * 28 + +cm * 28 + +cd;
const todayDays = +ty * 12 * 28 + +tm * 28 + +td;
if (todayDays - currentDays >= map.get(type)) acc.push(i + 1);
return acc;
}, []);
}
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level.2 요격 시스템 📌 (0) | 2023.06.02 |
---|---|
[프로그래머스 - JS][kakao] level.1 성격 유형 검사하기 (0) | 2023.05.30 |
[프로그래머스] level.2 가장 큰수 😱 (0) | 2023.05.26 |
[프로그래머스] level.3 베스트앨범 (0) | 2023.05.25 |
[프로그래머스] level.1 바탕화면 정리 (0) | 2023.05.23 |