개인정보 수집 유효기간

2024. 5. 27. 21:58알고리즘/카카오

2023 KAKAO BLIND RECRUITMENT

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 난이도 : Level 1
  • 소요 시간 : 30분
  • 실행 결과 : 통과

핵심 요구사항은 각 수집된 개인정보의 파기날짜를 구해서 오늘날짜와 비교해 파기해야하는 개인정보를 반환하는 것이다.

 

주의해야할 점이 있는데 하나는 유효기간의 범위이다.

예를 들어 A 약관은 12달동안 개인정보를 유지하는데 2020.05.10에 A약관을 동의했다면 유효기간의 범위는 2021.05.09까지이다.

2021.05.10이 되면 해당 정보는 파기되어야한다.

 

다른 하나는 날짜 계산할 때 12의 배수를 조심해야한다.

위의 사례로 이어서 설명하면 12달 동안 개인정보가 유지되므로 5 + 12 = 17이 되는데 12를 넘어가기 때문에 year을 (17 / 12)만큼 더해주고 month는 (17 % 12)의 값이 된다.

하지만 다른 약관은 19달 동안 유지된다고 하면 5 + 19 = 24인데 위의 계산방식을 적용하면 이상한 값이 나온다. 그러므로 다르게 계산해야한다. 이 경우에는 year에 (24 / 12) - 1만큼 더해주고 month는 12로 변경해야한다.

function solution(today, terms, privacies) {
    const ret = [];
    const [ty, tm, td] = today.split(".").map(Number);
    const termsMap = new Map();
    terms.forEach((elem)=>{
        const [term, m] = elem.split(" ");
        termsMap.set(term, Number(m));
    });
    
    privacies.forEach((privacy, idx)=>{
        const [date, term] = privacy.split(" ");
        const t = termsMap.get(term);
        let [y, m, d] = date.split(".").map(Number);
        const k = m + t;
        if(k % 12 === 0){
            y += (k / 12) - 1;
            m = 12;
        }
        else {
            y += Math.floor(k / 12);
            m = k % 12;
        }
        
        if(ty > y) ret.push(idx + 1);
        else if(ty === y && tm > m) ret.push(idx + 1);
        else if(ty === y && tm === m && td >= d) ret.push(idx + 1);
    });
    
    return ret;
}

 

오늘날짜와 파기날짜를 비교하는 과정이 조금 까다롭게 느껴진다.이렇게 구간, 기간 정보가 나올때는 하나의 데이터로 합치는 것이 효율적이다. 시와 분이 나오면 분으로 합치는 것처럼 말이다.

function solution(today, terms, privacies) {
    const ret = [];
    const [ty, tm, td] = today.split(".").map(Number);
    const todaySum = ty * 12 * 28 + tm * 28 + td;
    const termsMap = new Map();
    terms.forEach((elem)=>{
        const [term, m] = elem.split(" ");
        termsMap.set(term, Number(m));
    });
    
    privacies.forEach((privacy, idx)=>{
        const [date, term] = privacy.split(" ");
        const t = termsMap.get(term);
        let [y, m, d] = date.split(".").map(Number);
        const deleteDateSum = y * 12 * 28 + m * 28 + d + t * 28;
        if(todaySum >= deleteDateSum) ret.push(idx + 1);
    });
    
    return ret;
}

 

 

 

 

'알고리즘 > 카카오' 카테고리의 다른 글

주차 요금 계산  (0) 2024.05.29
양궁 대회  (0) 2024.05.29
두 큐 합 같게 만들기  (0) 2024.05.28
이모티콘 할인행사  (0) 2024.05.28
가장 많이 받은 선물  (0) 2024.05.27