terms로 제공된 약관 종류에 따라 설정된 유효기간에 맞추어 개인정보 수집일에 더해 현재날짜인 today와 비교하여
같은날이거나 지난 개인정보는 answer에 해당 번호를 넣어 리턴하는 문제이다.
처음 작성한 코드
function solution(today, terms, privacies) {
var answer = [];
//비교하기 위해 today를 연 월 일로나눠 배열에 넣음
let todaySplit = today.split('.')
let todayYear = todaySplit[0]
let todayMonth = todaySplit[1]
let todayDate = todaySplit[2]
//각 약관마다 Map객체에 넣어 놓음
let termsMap = new Map()
for (let j = 0; j<terms.length; j++) {
terms[j] = terms[j].split(' ')
termsMap.set(terms[j][0], terms[j][1])
}
//privacies를 중첩배열로 각 요소마다 나눠둠
//[[2020, 12, 01], D], ...]이런 형식
let privaciesSplit = []
for (let i = 0; i<privacies.length; i++) {
privaciesSplit.push(privacies[i].split(' '))
privaciesSplit[i][0] = privaciesSplit[i][0].split('.')
}
//비교하기 위한 반복문
for (let k = 0; k<privaciesSplit.length; k++) {
//수집기한을 Map객체에서 숫자형태로 가져옴
let expirePeriod = Number(termsMap.get(privaciesSplit[k][1]))
//나눠둔 privaciesSplit 배열에서 각 년, 월, 일을 가져옴
let privacieYear = Number(privaciesSplit[k][0][0])
let privacieMonth = Number(privaciesSplit[k][0][1])
let privacieDate = Number(privaciesSplit[k][0][2])
//수집월과 수집기한을 더해줌
let sumMonth = expirePeriod + privacieMonth
//더한 값이 12를 넘는다면 년에 넘친 년만큼 더해주고, 월 값을 조정해준다.
if (sumMonth > 12) {
privacieYear = privacieYear + Math.floor(sumMonth/12)
privacieMonth = sumMonth%12
//넘지 않는다면 월만 조정해준다.
} else {
privacieMonth = sumMonth
}
//privacieDate가 1이라면, 그 전날까지 수집기한이므로 월에서 1을 빼 일로 보내줌
if (privacieDate == 1) {
privacieMonth--
privacieDate = 28
//아니라면 그냥 하루 뺌
} else {
privacieDate--
}
//현재년,월,일과 조정된 수집 년,월,일 비교하여 기간만료시 해당 번호를 answer에 push
if (todayYear > privacieYear) {
answer.push(k+1)
} else if (todayYear == privacieYear) {
if (todayMonth > privacieMonth) {
answer.push(k+1)
} else if (todayMonth == privacieMonth) {
if (todayDate > privacieDate) {
answer.push(k+1)
}
}
}
}
return answer;
}
년 월 일을 조정하는게 맘처럼 되지 않았고, 작성하다가 갑자기 이상한 예외를 생각해 불필요한 코드를 작성하다보니 시간이 오래걸렸다. 당연히 테스트를 통과할 줄 알았는데...
17번 케이스를 실패했다.
17번 케이스는 위와 같다. 19년 12월 1일에 가입한 사람의 정보가 12개월간 저장되는데, 현재는 20년 12월 1일이다.
이때 해당 정보를 파기해야하므로 1번만 리턴하면 된다.
function solution(today, terms, privacies) {
var answer = [];
//비교하기 위해 today를 연 월 일로나눠 배열에 넣음
let todaySplit = today.split('.')
let todayYear = todaySplit[0]
let todayMonth = todaySplit[1]
let todayDate = todaySplit[2]
//각 약관마다 Map객체에 넣어 놓음
let termsMap = new Map()
for (let j = 0; j<terms.length; j++) {
terms[j] = terms[j].split(' ')
termsMap.set(terms[j][0], terms[j][1])
}
//privacies를 중첩배열로 각 요소마다 나눠둠
//[[2020, 12, 01], D], ...]이런 형식
let privaciesSplit = []
for (let i = 0; i<privacies.length; i++) {
privaciesSplit.push(privacies[i].split(' '))
privaciesSplit[i][0] = privaciesSplit[i][0].split('.')
}
//비교하기 위한 반복문
for (let k = 0; k<privaciesSplit.length; k++) {
//수집기한을 Map객체에서 숫자형태로 가져옴
let expirePeriod = Number(termsMap.get(privaciesSplit[k][1]))
//나눠둔 privaciesSplit 배열에서 각 년, 월, 일을 가져옴
let privacieYear = Number(privaciesSplit[k][0][0])
let privacieMonth = Number(privaciesSplit[k][0][1])
let privacieDate = Number(privaciesSplit[k][0][2])
//수집월과 수집기한을 더해줌
let sumMonth = expirePeriod + privacieMonth
//더한 값이 12를 넘는다면 년에 넘친 년만큼 더해주고, 월 값을 조정해준다.
if (sumMonth > 12) {
privacieYear = privacieYear + Math.floor(sumMonth/12)
privacieMonth = sumMonth%12
//넘지 않는다면 월만 조정해준다.
} else {
privacieMonth = sumMonth
}
//이부분 추가 ----------------------
//이부분 추가 ----------------------
//이부분 추가 ----------------------
if (privacieMonth == 0) {
privacieYear--
privacieMonth = 12
}
//이부분 추가 ----------------------
//이부분 추가 ----------------------
//이부분 추가 ----------------------
//privacieDate가 1이라면, 그 전날까지 수집기한이므로 월에서 1을 빼 일로 보내줌
if (privacieDate == 1) {
privacieMonth--
privacieDate = 28
//아니라면 그냥 하루 뺌
} else {
privacieDate--
}
//현재년,월,일과 조정된 수집 년,월,일 비교하여 기간만료시 해당 번호를 answer에 push
if (todayYear > privacieYear) {
answer.push(k+1)
} else if (todayYear == privacieYear) {
if (todayMonth > privacieMonth) {
answer.push(k+1)
} else if (todayMonth == privacieMonth) {
if (todayDate > privacieDate) {
answer.push(k+1)
}
}
}
}
return answer;
}
해당 케이스를 돌려보면 월이 0으로 나오게 된다. 이때 년에서 12달을 가져오면 예외처리가 완료된다.