본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv1 개인정보 수집 유효기간(python)

by 개발하는 호랑이 2024. 1. 29.

개인정보 수집 유효기간

 

 

풀이

풀이를 하면서 금방 풀 거라 생각했는데 테스트케이스에선 맞았으나, 실제 체험 간에 틀리는 경우가 있었다.
아래 테스트 케이스를 추가해서 확인을 해주었다.

"2020.12.17", ["A 12"], ["2010.01.01 A", "2019.12.17 A"], [1, 2]

처음 풀이하면서 크게 3가지 과정을 거쳤다.
1. 유효기간은 개월이므로 수집일자에서 개월 더하기
2. 더한 개월에 맞춰 년월일을 재구성하기
3. 현재 날짜와 종료일자를 년월일 순으로 비교하기

우선 맨 처음에 풀이를 진행하면서 %12를 사용함으로 월을 구분해 줬는데, 이때 만약 12로 떨어지게 되면 %12는 0이 된다는 것을 잊고 있었다. 그래서 이 문제를 해결하기 위해 아래와 같은 과정을 거쳤다.

if agree_date[1] > 12:
	if agree_date[1] % 12 == 0:
		agree_date[0] += ((agree_date[1] // 12)-1)
	else: agree_date[0] += ((agree_date[1] // 12))
	agree_date[1] = (agree_date[1] % 12)
	if agree_date[1] == 0:
		agree_date[1] = 12

물론 더 좋은 코드를 제출 하는 사람도 있겠지만, 해결하는 게 먼저리.
그러니 해결되었다.

# 개인정보 n개
# 약관 종류 별 개인정보 보관 유효기간
# 모든 달은 28일까지 있다고 가정
# A 6, B 12, C 3 의 방식 뒤의 값은 개월
# 오늘 기준으로 파기해야하는 것인지 확인 하고 파기해야하는 개인정보 번호 오름차순으로 result에 넣기
def solution(today, terms, privacies):
    result = []
    # 오늘 년,월,일
    today = [int(today[0:4]), int(today[5:7]), int(today[8:10])]
    # 약관 종류 재설정
    type_agrees = []
    for i in range(len(terms)):
        type_agrees.append(terms[i].split())
    # 개인정보 약관 동의일 및 종류
    for i in range(len(privacies)):
        date_type = privacies[i].split()    # 약관 동의일 및 종류를 구분한 리스트
        for type_agree in type_agrees:
            if date_type[1] in type_agree:
                # 비교를 위해 년월일 분리
                # the_year = int(date_type[0][0:4])
                # the_month = int(date_type[0][5:7])
                # the_day = int(date_type[0][8:10])
                agree_date = [int(date_type[0][0:4]), int(date_type[0][5:7]), int(date_type[0][8:10])]
                
                # 약관 유효기간 개월 더하기
                agree_date[1] += int(type_agree[1])  # 동의 타입에 적힌 동의 개월을 추가
                if agree_date[1] > 12:
                    if agree_date[1] % 12 == 0:
                        agree_date[0] += ((agree_date[1] // 12)-1)
                    else: agree_date[0] += ((agree_date[1] // 12))
                    agree_date[1] = (agree_date[1] % 12)
                if agree_date[1] == 0:
                    agree_date[1] = 12
                #오늘날짜와 약관 유효기간 비교하기
                for k in range(3):
                    if k == 2 and today[k] == agree_date[k]:
                        result.append(i+1)
                        break
                    elif today[k] != agree_date[k]:
                        if today[k] > agree_date[k]:
                            result.append(i+1)
                        break
    return result

다른 사람 풀이

다른 풀이는 아래처럼 푼 풀이가 있었다.

def to_days(date):
    year, month, day = map(int, date.split("."))
    return year * 28 * 12 + month * 28 + day

def solution(today, terms, privacies):
    months = {v[0]: int(v[2:]) * 28 for v in terms}
    today = to_days(today)
    expire = [
        i + 1 for i, privacy in enumerate(privacies)
        if to_days(privacy[:-2]) + months[privacy[-1]] <= today
    ]
    return expire