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

손규성·2023년 1월 24일
0

alogrithm

목록 보기
2/22
post-thumbnail

Level 1: 개인정보 수집 유효기간✍️


문제 설명

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

나의 풀이

const solution = (today, terms, privacies) => {
    const TODAY = today.split(".").map((dateComponent) => +dateComponent);

    const TERMS = terms.map((TERM) => {
        const [type, months] = TERM.split(" ");
        return { type: type, deleteAfter: +months };
    });

    const PRIVACIES = privacies.map((PRIVACY) => {
        const [registeredDate, type] = PRIVACY.split(" ");
        return { type: type, registered: registeredDate.split(".").map((num) => +num) };
    });

    const TO_DELETE = PRIVACIES.map((PRIVACY, idx) => {
        const [TARGET] = TERMS.filter((TERM) => TERM.type === PRIVACY.type);
        const Y = (TODAY[0] - PRIVACY.registered[0]) * 12;
        const M = TODAY[1] - PRIVACY.registered[1];
        const D = TODAY[2] - PRIVACY.registered[2];

        return Y + M > TARGET.deleteAfter ? idx + 1 : Y + M === TARGET.deleteAfter && D >= 0 ? idx + 1 : "X";
    });

    return TO_DELETE.filter((deletables) => deletables !== "X");
};

접근 방식

  • 최근 <모던 자바스크립트 Deep Dive> 책을 공부하며 재할당 가능한 변수, mutator 메서드를 사용하는 것에 대한 안좋은 점부수효과 등에 대해 많이 배우고 있다 (이전 문제풀이를 보면 알 수 있지만 let 키워드 등을 적극 활용해왔다)
  • 이번 문제를 풀면서 과거의 안좋았던 습관을 최대한 지양하며 풀어보려고 노력했다. 그래서 const 키워드 활용과, Array.prototype의 non-mutator 메서드인 map과 filter만 사용했다
  • 문제 접근 측면에서 얘기해보자면 우선 인수로 전달받은 today, terms, privacies를 각자 사용하기 쉬운 상태로 변경하며 풀이를 시작했다. 공백이나 마침표로 구분되어 있던 요소를 따로 따로 사용하기 위해 split 메서드를 사용했고, 객체 안에 숫자로 저장해야 되는 값은 Number 생성자 함수의 부수효과를 통해 타입 변환을 하기 보다는 + 연산자를 활용했다
  • 마지막엔 약관 종류인 'type' 값과 가입일 'registered' 정보를 가지고 있는 객체를 배열로 정리해둔 PRIVACY 배열을 map 메서드로 접근하여, today 기준 약관 종류에 명시된 개월 수 보다 많이 지났으면 idx + 1을, 약관 종류에 명시된 개월 수 보다 덜 지났으면 'X'를 TO_DELETE 배열에 담았다
  • 이후 반환문에서 TO_DELETE 배열에 filter 메서드를 사용해서 'X' 값만 빼고 반환하도록 했다

아쉬운 점

  • const 키워드, non-mutator 메서드를 활용해도 변수 남용하는 습관은 아직 개선이 필요해 보인다
profile
블로그 이사 → https://sqsung.tistory.com/

0개의 댓글