[JS] Programmers 150370 개인정보 수집 유효 기간

서연주·2023년 7월 10일
0

Algorithm

목록 보기
18/25

썸네일_제목은 PRGM 150370 개인정보 수집 유효 기간, 부제목은 JavaScript, 분류는 Algorithm

'개인정보 수집 유효기간'

Programmers '개인정보 수집 유효 기간' 문제 보러가기

풀이 코드

각 약관 유형 별 유효 기간을 탐색하기 좋게 저장해두고,
주어진 날짜 문자열을 계산하기 좋게 '일' 단위로 변환한 뒤 유효 일자와 주어진 오늘 날짜를 비교했다.

function makeElementToNum(arr){
    let result = [];
    for(let i=0;i<arr.length;i++){
        result.push(+arr[i]);
    }
    return result;
}

function countDays(date){
    let days = 0;
    let dateNum = makeElementToNum(date);
    
    for(let i=0;i<dateNum.length;i++){
        days+=dateNum[i];
    }
    
    return ((dateNum[0]-1)*336 + (dateNum[1]-1)*28 + dateNum[2]); 
}

function solution(today, terms, privacies) {
    var answer = [];
    
  // 각 유형 별 유효 기간을 저장한다
  // 유효 기간은 1 이상 100 이하임을 주의.
    const expiration = {}; 
    terms.map((term)=>{
        expiration[term.slice(0,1)] = Number(term.slice(2,5));
    });
    
    // privacies 배열을 순회한다
    // 각 개인 정보의 약관 종류에 따라 유효 일자 계산한다
        // 유효 일자 = 개인 정보 수집 일자 + 유효 기간
    // 유효 일자 < 오늘 날짜라면 정답 배열에 추가한다.
    privacies.map((privacy,i)=>{
        const date = privacy.slice(0,10).split(".");
        const type = privacy.slice(11,12);
        const validDays = countDays(date) + expiration[type]*28-1;
        const todayDays = countDays(today.split("."));
        
        if(validDays < todayDays){
            answer.push(i+1);
        }
    });
    
    return answer;
}

풀이가 오래 걸린 이유

  1. 날짜 문자열을 숫자로 바꾸는 과정에서 미숙함이 있었다.
  2. 문제에서는 한 달이 28일 이므로 1년은 365일이 아닌 336일이라는 점을 늦게 알아차렸다.
  3. 약관 종류에 따른 유효 기간 범위가 세자리 수까지 될 수 있음을 빠르게 꼼꼼히 살피지 못했다.

개선하기

*hyunmo 님의 코드를 참고하였습니다.
1. makeElementToNum() 대신 Number를 callback 함수로 넘겨주어 숫자로 변환
2. slice()가 아닌 ' ' 단위로 split() 하여 다양한 길이의 유효 기간 커버
3. 구조 분해 할당을 통한 가독성 높은 코드

📌 구조 분해 할당
; 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식이다.

  • 분해한 값이 undefined일 때 대신 사용할 수 있는 기본 값을 할당할 수 있다 : [a=5, b=7] = [1]; // a는 1 b는 7
  • 임시 변수 없이 두 변수의 값을 교환할 수 있다 : [a,b] = [b,a]
  • 불필요한 반환 값을 무시할 수 있다 : var [a, , b] = f();
function countDays(date){
    return ((date[0]-1)*12*28 + (date[1]-1)*28 + date[2]); 
}

function solution(today, terms, privacies) {
    var answer = [];
    const todayDays = countDays(today.split(".").map(Number));
    
    const expiration = {}; 
    terms.map((term)=>{
        let [type, duration] = term.split(" ");
        expiration[type] = Number(duration);
    });
    
    privacies.map((privacy,i)=>{
        let [date, type] = privacy.split(" ");
        date = date.split(".").map(Number);
        const validDays = countDays(date) + expiration[type]*28-1;
        
        if(validDays < todayDays){
            answer.push(i+1);
        }
    });
    
    return answer;
}

참고 자료

profile
pizz@ttang

0개의 댓글