[프로그래머스] 개인정보 수집 유효기간

최유나·2024년 10월 23일
0

프로그래머스

목록 보기
53/53

✨ 개인정보 수집 유효기간

나의 풀이

function solution(today, terms, privacies) {
    // 날짜를 일 단위로 변환하는 함수 
    const toDays = (date) => {
        const [year, month, day] = date.split('.').map(Number);
        return year * 12 * 28 + month * 28 + day;
    }
    
    // today를 일 단위로 변환
    const todayDays = toDays(today);
    
    // 약관 종류에 따른 유효기간을 저장할 딕셔너리
    const termDict = {};
    terms.forEach((term)=>{
        const [key, value] = term.split(' ');
        termDict[key] = Number(value);
    })
    
    // 파기해야 할 개인정보 번호를 저장할 배열
    let result = [];
    
    privacies.forEach((privacy, index) => {
        const [date, termType] = privacy.split(' ');
        // 수집된 날짜에 약관 유효기간을 더한 값
        const expireDays = toDays(date) + termDict[termType] * 28;
        // 유효기간이 지났으면 결과에 추가    
        if(expireDays <= todayDays) {
            result.push(index + 1)
        }
    })
    return result;
}
  1. toDays 함수: 날짜를 연도, 월, 일로 나누고 이를 일 단위로 변환하는 함수이다. 연도는 12개월, 한 달은 28일로 계산한다. 예를 들어, 1년은 12 * 28일로 처리된다. 이 함수는 2022.05.19 같은 날짜를 단순히 일수로 바꿔서 계산할 수 있게 해준다.

  2. todayDays: 주어진 오늘 날짜를 일 단위로 변환한다. 이 값을 기준으로 개인정보의 유효기간이 지났는지 비교하게 된다.

  3. termDict 객체: 약관 종류와 그에 해당하는 유효기간을 저장하는 객체이다. 예를 들어, A 6이 주어졌다면 A라는 약관의 유효기간은 6개월이 된다. 이를 termDict에 저장하여 나중에 약관 종류에 맞는 유효기간을 가져올 수 있게 한다.

  4. result 배열: 파기해야 할 개인정보의 번호를 저장할 배열이다. 최종적으로 이 배열을 반환하게 된다.

  5. privacies.forEach 반복문: 각 개인정보에 대해 수집 일자와 약관 종류를 분리하여 처리한다. 수집 일자를 toDays 함수를 통해 일수로 변환하고, 약관에 맞는 유효기간을 termDict에서 찾아서 이를 더한 후, 오늘 날짜와 비교하여 유효기간이 지났다면 해당 개인정보의 번호를 result에 추가한다.

  6. expireDays: 수집된 날짜에 약관 유효기간을 더한 값을 의미한다. 이 값이 오늘 날짜보다 작거나 같다면 유효기간이 지난 것으로 판단하고 해당 개인정보 번호를 결과에 추가한다.

  7. 주어진 오늘 날짜와 각 개인정보의 수집 일자를 비교하여 유효기간이 지난 개인정보를 찾아내고 그 번호들을 오름차순으로 반환한다.

다른사람의 풀이

// for문
function solution(today, terms, privacies) {
    let result = [];
    let obj1 = {};
    for(let e of terms){
        const [type, month] = e.split(" ");
        obj1[type] = month;
    }
    for(let i = 0; i < privacies.length; i++){
        const[start, type] = privacies[i].split(" ");
        let now = new Date(start);
        let date = new Date(today);
        now.setMonth(now.getMonth() + Number(obj1[type]));
        if(date >= now) result.push(i+1);
    }
    return result;
}

result 배열: 파기해야 할 개인정보 번호를 저장할 배열이다. 최종적으로 이 배열을 반환한다.

obj1 객체: 약관 종류와 그에 해당하는 유효기간(개월 수)을 저장하는 객체이다. 약관 정보 배열인 terms에서 약관 종류(type)와 유효기간(month)을 분리하여 obj1에 저장한다. 예를 들어, terms가 ["A 6", "B 12"]라면, obj1 객체는 { A: 6, B: 12 } 형태로 저장된다.

첫 번째 for 루프: terms 배열을 순회하면서 각 약관 정보를 객체 obj1에 저장한다. e.split(" ")을 사용해 약관 종류(type)와 유효기간(month)를 분리하고, 이를 객체의 키-값 쌍으로 저장한다.

두 번째 for 루프: privacies 배열을 순회하면서 각 개인정보 수집 일자와 약관 종류를 처리한다.

privacies[i].split(" ")를 사용해 개인정보 수집 일자(start)와 약관 종류(type)를 분리한다.

new Date(start)는 개인정보가 수집된 날짜를 Date 객체로 변환하고, new Date(today)는 오늘 날짜를 Date 객체로 변환한다.

now.setMonth(now.getMonth() + Number(obj1[type]))는 개인정보 수집 일자에 해당 약관의 유효기간(개월 수)을 더한다. 즉, 수집된 날짜에 약관에 따른 유효기간을 더한 새로운 날짜(now)를 계산한다.

날짜 비교: if (date >= now)는 오늘 날짜(date)가 개인정보의 유효기간이 지난 날짜(now)보다 크거나 같은지 확인하는 조건이다. 만약 오늘 날짜가 유효기간을 지난 경우라면, 해당 개인정보는 파기 대상이 된다.

결과 배열에 추가: 유효기간이 지났다면 result 배열에 해당 개인정보 번호(i + 1)를 추가한다. 번호는 1부터 시작하기 때문에 인덱스 i에 1을 더해 추가한다.

최종 반환: 유효기간이 지난 개인정보 번호들이 담긴 result 배열을 반환한다.

0개의 댓글

관련 채용 정보