function solution(today, terms, privacies) {
const todayDate = Number(today.split('.').join(''));
let termsObj = {};
terms.forEach((term, index) => {
const [contract, month] = term.split(' ');
termsObj[contract] = Number(month);
})
let ans = [];
privacies.forEach((privacy, index) => {
let [date, contract] = privacy.split(' ');
let [year, month, day] = date.split('.').map(Number);
month += termsObj[contract];
while(month > 12){
year += 1;
month -= 12;
}
year = String(year);
month = String(month).padStart(2,'0');
day = String(day).padStart(2,'0');
const calculatedDate = Number(year + month + day);
if(calculatedDate <= todayDate){
ans.push(index + 1);
}
})
return ans;
}
방법은 이렇다.
오늘 날짜
는 .
을 기준으로 합쳐서 하나의 숫자로 만들어준다.
'2022.05.19' ==> 20220519
그리고나서, 약관에 따른 유효 기간을 key-value로 만들어 객체 형태로 보관한다.
{
A : 6,
B : 12,
C : 3,
}
다음으로, 주어진 데이터의 수집 일자와 약관 종류를 활용하여 연산을 진행한다.
수집 일자와 약관 종류를 각각 다른 변수에 넣어준다.
이어서, 수집 일자를 각각 년, 월, 일
로 나눠 각각 다른 변수에 넣어준다.
여기서 구한 월
과 약간 종류에 따른 유효 기간(월 단위)
를 더한다.
이 값이 12
를 초과하는 경우 1년이 지나므로, year
를 1 증가시킨다.
여기서 주의할 점은, 유효 기간
은 1 ~ 100
의 값을 가진다는 것이다.
따라서, 이 연산을 한 번만 진행하는게 아니라, month
가 12
이하가 될 때까지 반복해줘야한다.
일
에 대한 연산은 하지 않는 이유는 간단하다.
문제에 모든 달은 28일로 통일한다고 되어있다.
따라서 1달
을 기준으로 연산하는 것이 28일
을 일일이 연산하는 것보다 훨씬 빠르고 정확하다.
아무튼, 위 연산이 끝나면 파기해야하는 날짜
가 year, month, day
에 들어가게 된다.
앞서, 오늘 날짜
를 하나의 number
로 바꿔놓았다.
이 때 사용하기 위해서였다.
파기해야하는 날짜
를 오늘 날짜
와 같은 형태로 만들어 크기를 비교하면
파기 대상인지 아닌지 판단할 수 있다.
제한 사항에 따라 month
와 day
는 한 자리수가 될 수도 있는데,
이 경우 padStart()
를 사용하여 앞이 0으로 되어있는 형태로 만들어야한다.
변환하면 string
타입의 새로운 값을 반환한다.
string
들을 더하면 string
이 이어지는 형태가 되므로,
이를 활용하여 오늘 날짜
와 같은 형태의 파기해야하는 날짜
를 만들 수 있다.
이를 number
타입으로 변환한 뒤, 크기 비교를 해주면 된다.
오늘 날짜
보다 파기해야하는 날짜
가 같거나 작은 경우,
파기 대상이므로 index + 1
을 정답 배열에 넣어준다.
제한 사항을 잘 읽고 생각하면 알고리즘 사고를 거치지 않아도 풀 수 있는 것 같다.
심지어, 이 풀이는 효율성 문제가 있지 않을까 했는데..결과가 괜찮게 나왔다.
가장 길게 걸린 시간이 1 ms가 안된다.
아마 테스트 케이스 자체가 제한 사항으로 인해 큰 값들이 없어서 그런 것 같다.