thumbnail

[lv.1] 개인정보 수집 유효기간

[lv.1] 개인정보 수집 유효기간

📋 [ 프로그래머스 ] 시리즈 몰아보기 (17)

✏️ (lv.1) : 개인정보 수집 유효기간

고객의 약관 동의를 얻어서 수집된 개인정보 n개가 있다. 약관의 종류는 여러개이며 각 약관별로 보관 유효기간이 정해져 있다. 모든 달은 28일까지 있다고 가정할 때 유효기간이 지난 개인정보는 파기하고자 한다.

오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 문자열 배열 terms, 수집된 개인정보를 담은 문자열 배열privacies가 주어질 때 파기해야할 개인정보의 번호를 오름차순으로 정수 배열에 담아 return하는 solution을 작성하라.


  • today는 "YYYY.MM.DD" 형태로 주어진다.
  • 1 <= terms.length <= 20
    • terms의 원소는 "약관 종류 유효기간" 형태로 약관 종류유효기간을 공백 하나로 구분한다.
    • 약관 종류A ~ Z까지의 알파벳 대문자 중 하나이며 서로 중복되는 경우는 없다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수로 1 이상 100 이하이다.
  • 1 <= privacies.length <= 20
    • privacies[i]i+1번 개인정보의 수집 일자와 약관 종류를 뜻한다.
    • privacies의 원소는 "날짜 약관종류" 형태로 날짜약관 종류를 공백 하나로 구분한다.
    • 날짜는 "YYYY.MM.DD" 형태이며 today 이전의 날짜만 주어진다.
    • privacies약관 종류는 항상 terms에 포함된 약관 종류만 주어진다.
  • todayprivacies에 등장하는 날짜YYYY는 연도, MM은 월, DD는 일을 나타내며 점 하나로 구분한다.
    • 2000 <= YYYY <= 2022
    • 1 <= MM <= 12
    • MM이 한 자릿수인 경우 앞에 0이 붙는다.
    • 1 <= DD <= 28
    • DD가 한 자릿수인 경우 앞에 0이 붙는다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어진다.

한달이 28일로 고정이므로 todayprivacies 각 원소(개인정보)의 날짜를 년, 월, 일에 각 단위에 해당하는 수 * 28을 수행해 일단위로 변환한 후 terms에 해당하는 일수를 더해 비교한다.

  • split()을 이용해 년, 월, 일을 쪼개 하나의 배열로 담은 후 년 * 12 * 28 + 월 * 28 + 일 을 수행해 일단위로 변환한다.
  • split()을 이용해 약관 종류유효기간을 배열로 분리한 후 reduce()를 이용해 객체를 반환, 해당 객체의 key값으로 각 원소의 약관 종류를, value값으로 유효기간을 할당한다.
  • privaciesitem으로 순회하며 다음 로직을 수행한다.
    • itemsplit()을 이용해 약관 종류날짜로 분리하여 배열 target에 담는다.
    • target[0](날짜)today와 같은 로직을 수행 후 그 결과값을 변수 date에 담는다.
    • terms에서 target[1](약관 종류)에 해당하는 key의 value값에 28을 곱해 변수 validate에 담는다.
    • datevalidate를 더한 값을 변수 compareDate로 초기화한다.
    • todaycompareDate보다 크거나 같은 경우 해당 원소의 index + 1의 값을 result에 push한다.
  • result를 반환한다.
          
1 function solution(today, terms, privacies) {
2 const result = [];
3 today = today.split(".").map(e => +e);
4 today = today[2] + today[1] * 28 + today[0] * 28 * 12;
5 terms = terms.reduce((acc, item) => {
6 let target = item.split(" ");
7 return { ...acc, [target[0]]: +target[1] };
8 }, {});
9
10 privacies.forEach((item, i) => {
11 let target = item.split(" ");
12 let date = target[0].split(".").map(e => +e);
13 const validate = terms[target[1]] * 28;
14 let compareDate = date[2] + date[1] * 28 + date[0] * 28 * 12 + validate;
15
16 if (today >= compareDate) {
17 result.push(i + 1);
18 }
19 });
20
21 return result;
22 }
23
# 프로그래머스
# JS
# javascript
# 코딩테스트
# 알고리즘
# 구현
# kakao

💡 로그인 하지 않아도 댓글을 등록할 수 있습니다!

👨‍💻 관련 포스트