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

rivermt·2023년 7월 5일
0

programmers

목록 보기
4/6

문제

https://school.programmers.co.kr/learn/courses/30/lessons/150370?language=python3

유효기간이 지난 약관들이 무엇인지 판단하는 문제이다.

SOL

첫번째 풀이

주어진 문제 그대로 구현을 했다.
약관의 유효기간을 딕셔너리를 통해 저장하고 privacies 배열을 탐색하며 주어진 날짜에 해당 약관 종류의 유효기간을 더한
날짜가 오늘보다 같거나 크다면 유효기간이 지난 것이므로 answer 배열에 추가해주었다. 유효기간의 단위가 월이므로 월을 더하고
12가 넘으면 연을 더해주는 식으로 구현했다.
10보다 작은 월 또는 날은 앞에 0을 붙이기 위해 코드가 조금 더러워 보인다.

def solution(today, terms, privacies):
    answer = []
    days = {}
    idx = 1
    ty, tm, td = map(int, today.split("."))
    for term in terms:
        tp, day = term.split();
        days[tp] = int(day)

    for privacy in privacies:
        dt, tp = privacy.split()
        y, m, d = map(int, dt.split("."))
        m += days[tp]
        
        while m > 12:
            y += 1
            m -= 12
       
        s = ""
        
        s += str(y) + "."
        if m < 10:
            s += "0" + str(m) + "."
        else:
            s += str(m) + "."
        if d < 10:
            s += "0" + str(d)
        else:
            s += str(d)
        
        if today >= s:
            answer.append(idx)
    
        idx += 1

    return answer

두번째 풀이

더 깔끔한 풀이가 있을지 고민하는 중 방법을 찾았다.
int, string을 계속 연산하고 변환하지 않고 애초에 단위를 일로 통일 하는 것이다.

그렇게 하면 Y-M-D 를 (Y x 12 x 28) + (M x 28) + D 이런식으로 날짜를 수로 표현할 수 있게된다. (문제에서 한달을 28일로 고정함)
이렇게 수로 변환해버리면 비교 및 연산이 상당히 깔끔해지고 쉬워짐을 확인할 수 있다.

def split_date(d):
    return map(int, d.split("."))


def date_to_int(y, m, d):
    return (y * 12 * 28) + (m * 28) + d


def solution(today, terms, privacies):
    # 연, 월을 일로 나타내서 처리하자
    answer = []
    ty, tm, td = split_date(today)
    cmp = date_to_int(ty, tm, td)
    dic = {}
    
    for term in terms:
        kind, date = term.split()
        dic[kind] = int(date) * 28
    
    idx = 1
    
    for privacy in privacies:
        date, kind = privacy.split()
        y, m, d = split_date(date)
        cur = date_to_int(y, m, d) + dic[kind]
        
        if cmp >= cur:
            answer.append(idx)
            
        idx+=1
            
    return answer
profile
화이팅!!

0개의 댓글