2차 공부/알고리즘

개인정보 수집 유효기간

공대탈출 2024. 7. 1. 16:14

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

terms로 제공된 약관 종류에 따라 설정된 유효기간에 맞추어 개인정보 수집일에 더해 현재날짜인 today와 비교하여

같은날이거나 지난 개인정보는 answer에 해당 번호를 넣어 리턴하는 문제이다.

 

처음 작성한 코드

function solution(today, terms, privacies) {
    var answer = [];        
    //비교하기 위해 today를 연 월 일로나눠 배열에 넣음
    let todaySplit = today.split('.')
    let todayYear = todaySplit[0]
    let todayMonth = todaySplit[1]
    let todayDate = todaySplit[2]
    
    //각 약관마다 Map객체에 넣어 놓음
    let termsMap = new Map()
    for (let j = 0; j<terms.length; j++) {
        terms[j] = terms[j].split(' ')
        termsMap.set(terms[j][0], terms[j][1])
    }
    
    //privacies를 중첩배열로 각 요소마다 나눠둠
    //[[2020, 12, 01], D], ...]이런 형식
    let privaciesSplit = []
    for (let i = 0; i<privacies.length; i++) {
        privaciesSplit.push(privacies[i].split(' '))
        privaciesSplit[i][0] = privaciesSplit[i][0].split('.')
    }
    
    //비교하기 위한 반복문
    for (let k = 0; k<privaciesSplit.length; k++) {
        //수집기한을 Map객체에서 숫자형태로 가져옴
        let expirePeriod = Number(termsMap.get(privaciesSplit[k][1]))
        //나눠둔 privaciesSplit 배열에서 각 년, 월, 일을 가져옴
        let privacieYear = Number(privaciesSplit[k][0][0])
        let privacieMonth = Number(privaciesSplit[k][0][1])
        let privacieDate = Number(privaciesSplit[k][0][2])
        
        //수집월과 수집기한을 더해줌
        let sumMonth = expirePeriod + privacieMonth
        //더한 값이 12를 넘는다면 년에 넘친 년만큼 더해주고, 월 값을 조정해준다.
        if (sumMonth > 12) {
            privacieYear = privacieYear + Math.floor(sumMonth/12)
            privacieMonth = sumMonth%12
            //넘지 않는다면 월만 조정해준다.
        } else {
            privacieMonth = sumMonth
        }
        //privacieDate가 1이라면, 그 전날까지 수집기한이므로 월에서 1을 빼 일로 보내줌
        if (privacieDate == 1) {
            privacieMonth--
            privacieDate = 28
            //아니라면 그냥 하루 뺌
        } else {
            privacieDate--
        }
        
        //현재년,월,일과 조정된 수집 년,월,일 비교하여 기간만료시 해당 번호를 answer에 push
        if (todayYear > privacieYear) {
            answer.push(k+1)
        } else if (todayYear == privacieYear) {
            if (todayMonth > privacieMonth) {
                answer.push(k+1)
            } else if (todayMonth == privacieMonth) {
                if (todayDate > privacieDate) {
                    answer.push(k+1)
                }
            }
        }
    }
    return answer;
}

 

년 월 일을 조정하는게 맘처럼 되지 않았고, 작성하다가 갑자기 이상한 예외를 생각해 불필요한 코드를 작성하다보니 시간이 오래걸렸다. 당연히 테스트를 통과할 줄 알았는데...

17번 케이스를 실패했다.

17번 케이스는 위와 같다. 19년 12월 1일에 가입한 사람의 정보가 12개월간 저장되는데, 현재는 20년 12월 1일이다.

이때 해당 정보를 파기해야하므로 1번만 리턴하면 된다. 

 

function solution(today, terms, privacies) {
    var answer = [];        
    //비교하기 위해 today를 연 월 일로나눠 배열에 넣음
    let todaySplit = today.split('.')
    let todayYear = todaySplit[0]
    let todayMonth = todaySplit[1]
    let todayDate = todaySplit[2]
    
    //각 약관마다 Map객체에 넣어 놓음
    let termsMap = new Map()
    for (let j = 0; j<terms.length; j++) {
        terms[j] = terms[j].split(' ')
        termsMap.set(terms[j][0], terms[j][1])
    }
    
    //privacies를 중첩배열로 각 요소마다 나눠둠
    //[[2020, 12, 01], D], ...]이런 형식
    let privaciesSplit = []
    for (let i = 0; i<privacies.length; i++) {
        privaciesSplit.push(privacies[i].split(' '))
        privaciesSplit[i][0] = privaciesSplit[i][0].split('.')
    }
    
    //비교하기 위한 반복문
    for (let k = 0; k<privaciesSplit.length; k++) {
        //수집기한을 Map객체에서 숫자형태로 가져옴
        let expirePeriod = Number(termsMap.get(privaciesSplit[k][1]))
        //나눠둔 privaciesSplit 배열에서 각 년, 월, 일을 가져옴
        let privacieYear = Number(privaciesSplit[k][0][0])
        let privacieMonth = Number(privaciesSplit[k][0][1])
        let privacieDate = Number(privaciesSplit[k][0][2])
        
        //수집월과 수집기한을 더해줌
        let sumMonth = expirePeriod + privacieMonth
        //더한 값이 12를 넘는다면 년에 넘친 년만큼 더해주고, 월 값을 조정해준다.
        if (sumMonth > 12) {
            privacieYear = privacieYear + Math.floor(sumMonth/12)
            privacieMonth = sumMonth%12
            //넘지 않는다면 월만 조정해준다.
        } else {
            privacieMonth = sumMonth
        }
        //이부분 추가 ----------------------
        //이부분 추가 ----------------------
        //이부분 추가 ----------------------
        if (privacieMonth == 0) {
            privacieYear--
            privacieMonth = 12
        }
        //이부분 추가 ----------------------
        //이부분 추가 ----------------------
        //이부분 추가 ----------------------
        //privacieDate가 1이라면, 그 전날까지 수집기한이므로 월에서 1을 빼 일로 보내줌
        if (privacieDate == 1) {
            privacieMonth--
            privacieDate = 28
            //아니라면 그냥 하루 뺌
        } else {
            privacieDate--
        }
        
        //현재년,월,일과 조정된 수집 년,월,일 비교하여 기간만료시 해당 번호를 answer에 push
        if (todayYear > privacieYear) {
            answer.push(k+1)
        } else if (todayYear == privacieYear) {
            if (todayMonth > privacieMonth) {
                answer.push(k+1)
            } else if (todayMonth == privacieMonth) {
                if (todayDate > privacieDate) {
                    answer.push(k+1)
                }
            }
        }
    }
    return answer;
}

해당 케이스를 돌려보면 월이 0으로 나오게 된다. 이때 년에서 12달을 가져오면 예외처리가 완료된다.

'2차 공부 > 알고리즘' 카테고리의 다른 글

공원 산책  (0) 2024.07.03
달리기 경주  (0) 2024.07.02
성격 유형 검사하기  (0) 2024.06.27
햄버거 만들기  (0) 2024.06.25
대충 만든 자판  (1) 2024.06.21