[프로그래머스 | Javascript] 2023 KAKAO BLIND RECRUITMENT - 개인정보 수집 유효기간

박기영·2023년 1월 5일
0

프로그래머스

목록 보기
111/159
post-custom-banner

solution

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의 값을 가진다는 것이다.
따라서, 이 연산을 한 번만 진행하는게 아니라, month12 이하가 될 때까지 반복해줘야한다.

에 대한 연산은 하지 않는 이유는 간단하다.
문제에 모든 달은 28일로 통일한다고 되어있다.
따라서 1달을 기준으로 연산하는 것이 28일을 일일이 연산하는 것보다 훨씬 빠르고 정확하다.

아무튼, 위 연산이 끝나면 파기해야하는 날짜year, month, day에 들어가게 된다.
앞서, 오늘 날짜를 하나의 number로 바꿔놓았다.
이 때 사용하기 위해서였다.

파기해야하는 날짜오늘 날짜와 같은 형태로 만들어 크기를 비교하면
파기 대상인지 아닌지 판단할 수 있다.

제한 사항에 따라 monthday는 한 자리수가 될 수도 있는데,
이 경우 padStart()를 사용하여 앞이 0으로 되어있는 형태로 만들어야한다.
변환하면 string 타입의 새로운 값을 반환한다.
string들을 더하면 string이 이어지는 형태가 되므로,
이를 활용하여 오늘 날짜와 같은 형태의 파기해야하는 날짜를 만들 수 있다.

이를 number 타입으로 변환한 뒤, 크기 비교를 해주면 된다.
오늘 날짜보다 파기해야하는 날짜가 같거나 작은 경우,
파기 대상이므로 index + 1을 정답 배열에 넣어준다.

제한 사항을 잘 읽고 생각하면 알고리즘 사고를 거치지 않아도 풀 수 있는 것 같다.
심지어, 이 풀이는 효율성 문제가 있지 않을까 했는데..결과가 괜찮게 나왔다.
가장 길게 걸린 시간이 1 ms가 안된다.
아마 테스트 케이스 자체가 제한 사항으로 인해 큰 값들이 없어서 그런 것 같다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글