알고리즘🅰/프로그래머스

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

개발조각 2023. 2. 2. 13:15
728x90
반응형

문제


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

 

프로그래머스

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

programmers.co.kr

 

 

 

해결 방안


today - privavies날짜를 빼면 남은 날을 계산하면 금방 해결할 수 있겠다는 생각이 들었습니다.

today = "2022.05.19"

// 배열로 바꾸기
today = [2022, 05, 19]
privacies = ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]

// 각각을 배열로 바꾸기
privacies[0] = [2021, 05, 02, 'A']
privacies[1] = [2021, 07, 01, 'B']
privacies[2] = [2022, 02, 19, 'C']
privacies[3] = [2022, 02, 20, 'C']

 

각 날짜를 빼기 쉽게 배열로 바꾸고 today - privavies날짜를 하면 아래와 같이 됩니다.

today - privacies[0] = [2022, 05, 19] - [2021, 05, 02] = [1, 0, 17]
today - privacies[1] = [2022, 05, 19] - [2021, 07, 01] = [1, -2, 18]
today - privacies[2] = [2022, 05, 19] - [2022, 02, 19] = [0, 3, 0]
today - privacies[3] = [2022, 05, 19] - [2022, 02, 20] = [0, 3, -1]

이 문제에서 약관 종류의 유효기간(terms)을 보시면 달(Month)로 되었고, 달(Moth)를 기준으로 계산하면 되겠는데?라는 생각이 들었습니다.

그래서 today - privavies날짜값의 년(year)+달(Month)를 합치고 달(Moth)로 표기하기로 했습니다.

today - privacies[0] = [1, 0, 17] = [12, 17]
today - privacies[1] = [1, -2, 188] = [10, 18]
today - privacies[2] = [0, 3, 0] = [3, 0]
today - privacies[3] = [0, 3, -1] = [3, -1]

그러나 여기서 일(day)가 -1이면 유효기간(terms)에서 달로 빼버리면 이상한 상황이 발생할 것 같아

"모든 달은 28일까지 있다고 가정합니다." 라는 문구를 참고하여

일(day)가 0보다 작을 경우 처리를 해주었습니다.

 

today - privacies[0] = [12, 17]
today - privacies[1] = [10, 18]
today - privacies[2] = [3, 0]
today - privacies[3] = [3, -1] = [2, 27]

그럼 각 유효기간보다 많이 넘었는지만 구하면 끝나게 됩니다.

 

 

 

소스코드


function solution(today, terms, privacies) {
    var answer = [];
    
    terms = terms.map(x=> x.split(' ').map(x=> parseInt(x) ? parseInt(x) : x));
    let termsObj = {};
    for(let i=0; i<terms.length; i++){
        termsObj[terms[i][0]] = terms[i][1];
    }
    
    let todayArr = today.split('.').map(x=> parseInt(x));
    
    for(let i=0; i<privacies.length; i++){
        let privacieStr = privacies[i].replace(/[.]/g, ' ');
        let privacieArr = privacieStr.split(' ').map(x=> parseInt(x) ? parseInt(x) : x);
        
        let remain = [12*(todayArr[0]-privacieArr[0])+(todayArr[1]-privacieArr[1]), todayArr[2]-privacieArr[2]]
        if(remain[1] < 0){
            remain = [remain[0]-1, 28+remain[1]]
        }
                
        let term = termsObj[privacieArr[3]];
        
        if(remain[0] >= term){
            answer.push(i+1);
        }
    }
    return answer;
}
728x90
반응형