


한달을 28일로 윤년이 없는 다루기 쉬운조건을 준거보면 뭔가 빡센 문제일지도 모르겠다 ㄷㄷ
일단 약관은 일단위로 보관되니까 하루마다 이런 알고리즘을 짜놓고 돌리는게 아닐까?
일단 방법이 두가지 있을 것같다.
1. 자바스크립트의 내장 날짜를 쓰기
2. 월을 28일 , 연을 336(28*12)로 두고 계산하기
2번으로 가보자.
다 좋은데 terms도 privacies도 배열안에 배열 또는 key-value가 들어 있지 않고 "A 6"이런식으로 들어 있어서 이것을 어떻게 key-value 또는 배열안의 배열로 나누느냐가 관건일것같다.

생각한대로 나오긴하는데 보나마자 약관이 AAA 이런식으로 1자리수가 아닌 테스트케이스가 섞여있을 확률이 120% 정도 되기 때문에 다른 방법으로 나눠야할것같다.

.split(" ")(따옴표 사이에 공백 잊지말 것)으로 해보니 원하는 것과 비슷하게 나온다.

key-value 오브젝트를 사용해본적이 없어서 한번에 안들어가는데서 좀 놀랬다.
아무튼 원하는데로 terms를 고쳤으니 privacies도 해보자


Object.keys(또는 values)로 값을 불러온 뒤에는 [0]를 붙이자.
function sol0(today, terms, privacies) {
const answer = [];
const lengthTerms = terms.length;
const lengthPrivacies = privacies.length;
const todayParts = today.split(".")
const newToday = (parseInt(todayParts[0])-1)*12*28+(parseInt(todayParts[1])-1)*28+parseInt(todayParts[2])
const newTerms = []
const newPrivacies = []
for (let i = 0; i < lengthTerms; i++) {
const termParts = terms[i].split(" ");
const termObject = {};
termObject[termParts[0]] = parseInt(termParts[1])*28;
newTerms.push(termObject);
}
for (let i = 0 ; i < lengthPrivacies ; i++) {
const date = privacies[i].split(".")
const day = parseInt(date[2].split(" ")[0])
const termNow = date[2].split(" ")[1]
let plusDate = 0
for (let j = 0 ; j < lengthTerms ; j++){
const key = Object.keys(newTerms[j])[0]
const value = Object.values(newTerms[j])[0]
if (termNow === key) {
plusDate = value
}
}
const expireDate = (parseInt(date[0])-1)*12*28+(parseInt(date[1])-1)*28+day+plusDate
newPrivacies.push(expireDate)
}
for (let i = 0 ; i < lengthPrivacies ; i++) {
if (newPrivacies[i] <= newToday){
answer.push(i+1)
}
}
return answer;
}
(년도-1)1228 + (달수-1)*28 + 일수 로 날짜를 치환하여 만료 여부를 판별하는 방식이다.
function sol1(today, terms, privacies) {
var answer = [];
var [year, month, date] = today.split(".").map(Number);
var todates = year * 12 * 28 + month * 28 + date;
var t = {};
terms.forEach((e) => {
let [a, b] = e.split(" ");
t[a] = Number(b);
});
privacies.forEach((e, i) => {
var [day, term] = e.split(" ");
day = day.split(".").map(Number);
var dates = day[0] * 12 * 28 + day[1] * 28 + day[2] + t[term] * 28;
if (dates <= todates) answer.push(i + 1);
});
return answer;
}
상대적인 차이만 볼거기 때문에 -1은 필요가 없었던것같다.
function sol2(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;
}, []);
}
split한 결과물을 깔끔하게 정의했다.
그리고 return안에 return이 들어가도 되는거였다.
terms와 privacies의 길이에 정비례한다.


처리해야할 privacies를 증가시켰을 나의 코드가 제일 많이 증가한다. 심지어 처음 작동시간도 제일 긴데... 내가 효율적으로 짜지 못한것 같다 어디서 느려진걸까?
const key = Object.keys(newTerms[j])[0];
const value = Object.values(newTerms[j])[0];
아마 위의 부분에서 커다란 객체를 다루기때문에 좋지 못한 결과가 나온것같다.

sol2에 불필요한 반복이 있어서 개선하였다.
//반복문안에 같은 결과를 내는 것이 존재
return privacies.reduce((acc, curr, i) => {
const [ty, tm, td] = today.split(".");
}
// 반복문 밖으로 내놓음
const ty = today.split(".")[0];
const tm = today.split(".")[1];
const td = today.split(".")[2];
return privacies.reduce((acc, curr, i) => {
split으로 나온 것들을 직관적으로 매핑해놨다.