본문 바로가기

Algorithm

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

오래간만에 프로그래머스 알고리즘 문제를 풀어봤다. 맨날 JAVA만 사용해서 개발하다 알고리즘만은 Python을 놓치기 힘들어 Python으로 풀어봤는데 세미콜론과 괄호가 자동으로 들어가는건 기분탓인가?

 

그래도 아직은 머리가 돌아가나 보다... 생각외로 빠르게 풀어냈다.(나름의 구글링을 사용했지만 말이다.)

 

풀이를 시작해보자.

 

문제

 

문제가 꽤나 길다.. 그래도 이해하기는 충분히 쉬운 문제인 것 같다는 생각이였다.

 

입출력 예

풀이

나는 날짜라는 개념을 보자마자 Python의 Datetime을 가장 먼저 생각하게 되었다.

하지만, 변수가 하나 존재했다.

너무 큰 변수이다 보니 일부러 사진은 크게 해두겠다.

 

왜 변수이냐면, Datetime을 사용하면 매 달의 마지막 달은 실제 달의 마지막 날과 같게 출력될 것이다.

결국 모든 달은 28일로 끝나지 않는다는 뜻이다. 그래도 여러가지 방법으로 풀어보겠다는 마음으로 진행해 보았다.

(문제를 풀고, 블로그를 작성하며 대참사는 아닌 것 같다라는 생각이 잠시 들었다.. 생각을 정리해 보아야 겠다.)

 

진짜 풀이를 시작하겠다.

우선 주어진 파라미터 중 날짜가 포함되어 있는 부분들은 모조리 Datetime Type으로 변경했다.

이렇게 되면 Date에 달(month)을 더하고 빼는 것은 날짜도 함께 변경할 필요가 없기 때문에 훨씬 쉽다라는 생각이 들었던 것 같다.

 

이 상태에 지정해둔 약관 종류에 맞춰 달(momth)을 더한 후 하루를 빼준다. 그래야 당일날 파기가 되기 때문에.

(물론 약관에 대한 값만 넣어주면 얼만큼 더해줘야 할지 dictionary를 사용하여 지정해두었다.)

 

이 상태에서 privacyDate가 today보다 작을 경우는 모두 파기가 되지 않는 정보이기 때문에 해당 idx + 1 을 answer에 담아준다.

결과

통과가 되지 않는 대참사가 일어날 줄 알았지만.. 다행이 통과했다.

뭔가 굉장히 아쉬운 듯한 느낌이 들기에 조금 더 파봐야겠다.

끝!

 

전체코드

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

def solution(today, terms, privacies):
    answer = []
    term = {}
    today = datetime.strptime(today, '%Y.%m.%d')
    
    for t in terms:
        term[t.split(" ")[0]] = int(t.split(" ")[1])
    
    idx = 1
    for p in privacies:
        privacyDate = datetime.strptime(p.split(" ")[0], '%Y.%m.%d') + relativedelta(months=term[p[-1]]) - timedelta(days=1)
        
        if privacyDate < today:
            answer.append(idx)
        idx += 1

            
    return answer