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

mj·2024년 7월 12일
0

코딩테스트문제

목록 보기
34/50

✅ 문제

문제 바로가기

  • 구해야 하는 것 : 오늘 날짜로 파기해야 할 개인정보 번호들

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보이다.

유효기간이 끝난 다음날. 즉, 파기를 해도 되는 가장 빠른 날짜를 파기시작일이라 정의하면, 2022년 1월 5일이 파기시작일이다.
따라서 파기시작일이 현재날짜와 같거나 더 이전의 날짜이면 파기해야 한다.

✅ 나의 풀이 과정

💡 나의 아이디어

  1. 약관의 유효기간을 담은 배열 terms 를 딕셔너리 약관종류: 유효기간 로 바꾼다.
  2. privacies을 하나씩 순회하며 파기시작일을 계산한다.
  3. 이때, 파기시작일 <= 현재날짜 이면 최종결과배열에 개인정보번호를 추가한다.

파기시작일과 현재날짜는 YYYYMMDD형태의 정수로 비교한다. (2024년 5월 3일의 경우 정수 20240503로 표현)

처음에는 년, 월, 일을 나누어 비교하는 방법을 생각하였으나 YYYYMMDD로 정수의 형태로 비교해도 결과는 같으므로 더 간단한 후자의 방법을 선택하였다.

구현

1. terms를 딕셔너리로 변환

# BEFORE
["A 6", "B 12", "C 3"]
# AFTER
{"A": 6, "B": 12, "C":3}

2. 파기시작일 계산

개인정보 날짜를 년 y, 월 m, 일 d 로 분리한 후, 유효기간 달 수(term)를 더하여 계산한다.

        m += term 
        if m > 12:
            y += m // 12
            m = m % 12
            if m==0: 
                m = 12
                y -= 1

실수했던 부분

m % 12 == 0 이되는 경우는 따로 처리해주어야 한다.
예를 들어, 개인정보 날짜가 2019년 12월 1일이고 유효기간이 12개월이라 하면 파기시작일은 2020년 12월 1일이다.
하지만 따로 처리해주지 않는다면 아래의 계산대로 2021년 0월이 된다.

  • m + term = 12 + 12 = 24
  • y = 2019 + 2 = 2021
  • m = m % 12 = 24 % 12 = 0

3. YYYYMMDD 형태로 변환하고 비교하기

파기시작일과 현재날짜를 정수로 비교하기 위해 YYYYMMDD형태로 만들고 <= 연산자로 비교한다.
MMDD가 한 자릿수인경우 0을 붙여 두자리로 만들어주어야 한다.


✅ 나의 코드

# 한 자릿수인경우 두 자릿수로 만들어주는 함수
def makeDoubleDigit(x):
    x = int(x)
    if x < 10:
        x = "0" + str(x)
    return str(x)

def solution(today, terms, privacies):
    result = []
    
    # terms -> 딕셔너리로 변환 
    termsDic = {}
    for term in terms:
        a, b = term.split(" ")
        termsDic[a] = int(b)
    
    today = "".join(today.split("."))
    
    for idx, privacy in enumerate(privacies):
        date, term = privacy.split(" ")
        term = termsDic[term]
        y, m, d = map(int, date.split("."))
        
        # 파기일 계산
        m += term
        if m > 12:
            y += m // 12
            m = m % 12
            if m==0: 
                m = 12
                y -= 1
        
        date = "".join(map(makeDoubleDigit, [y, m, d]))

		# 현재날짜와 파기시작일 비교
        if (int(today) >= int(date)):
            result.append(idx+1)
    
    return result
    

✅ 다른 풀이 방법

  • 일 수로 바꿔 계산하기
    이 문제에서 모든 달은 28일까지 있다고 가정하였으므로 일 수로 바꿔 계산하는 것이 예외를 생각하지 않아도 되므로 더 간단할것 같다.
profile
일단 할 수 있는걸 하자.

0개의 댓글