종식당

[프로그래머스 lv.1] 2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간 본문

프로그래머스

[프로그래머스 lv.1] 2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간

종식당 2024. 3. 19. 14:27
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 문제 설명
    privacis리스트에 주어진 날짜와 약관 종류가 주어지고, terms리스트에는 약관 종류와 이에 해당하는 유효기간이 주어진다. privacis리스트에서 주어진 날짜에 해당 약관 종류의 유효기간이 지났을 때 today에 명시되어 있는 오늘 날짜보다 더 이후의 개인정보는 파기한다. 만약 리스트에서 첫 번째 세 번째 자리의 개인정보를 파기해야 할 때 [1,3]을 return 하면 된다.

  • 첫 번째 제출 코드
def solution(today, terms, privacies):
    answer = []
    dict = {}
    for i in terms:
        type_terms, month = i.split()
        dict[type_terms] = int(month)
    for j,i in enumerate(privacies):
        date, condition = i.split()
        y,m,d = map(int,date.split("."))
        m = m+dict[condition]
        d = d-1
        if m > 12:
            m = m - 12
            y += 1
        if d == 0:
            m-=1
            d = 28
        t_y,t_m,t_d =map(int,today.split("."))
        
        if y < t_y or (y == t_y and m < t_m) or (y == t_y and m == t_m and d < t_d):
            answer.append(j + 1) 
    return answer

 

먼저 약관 종류의 타입에 해당하는 유효기간을 저장해야 했기 때문에 이를 딕셔너리를 만들어 저장하였다. 

terms리스트를 보면 하나의 원소에 공백을 기준으로 왼쪽은 약관 종류 오른쪽에는 유효기간이 저장되어 있기 때문에 이를 split으로 나누고 약관 종류를 key, 유효기간을 value값으로 저장해주었다. 

그리고 privacies를 for문을 돌면서 날짜와 약관 종류를 split으로 분리하였다. 그리고 날짜에서 다시 "."을 기준으로 년, 월, 일을 나누었다. 그리고 조건에 따라서 y, m, d의 값이 잘 출력되게 set 해주고 today에서 다시 한번 날짜를 분리해서 이 둘을 서로 비교해 주었다. 년, 월, 일을 일일이 나누어서 서로 비교해 주고 today보다 큰 녀석들을 enumerate를 통해 알아낸 index를 answer리스트에 추가해 answer리스트를 반환해 주었다. 
코드 실행에서는 오류가 없었지만 제출 후 채점에서 틀린 답안이 존재했다. 아마도 년, 월, 일을 일일이 나눠서 비교할 때 문제가 발생하는 것 같다.

 

  • 정답 코드
def convert_date(day):
    y, m, d = map(int,day.split("."))
    return y*12*28+m*28+d

def solution(today, terms, privacies):
    answer = []
    dict = {}
    today = convert_date(today)
    
    for i in terms:
        type_terms, month = i.split()
        dict[type_terms] = int(month)
        
    for j,i in enumerate(privacies):
        date, condition = i.split()
        if convert_date(date) + dict[condition]*28 <= today:
            answer.append(j+1)
        
    return answer

 

초반에 딕셔너리를 사용하고 split해주는 부분은 모두 동일하다. 하지만 날짜를 비교할 때 년, 월을 모두 일로 변화해주어서 서로 비교하는 코드만 다르다. split을 통해 나온 y에 *12*28을 해주면 일이 나오고 m에 *28을 하면 일이 나오므로 이렇게 변환한 y, m, d를 모두 더해서 이들을 비교해 today와 비교해 이 보다 작으면 answer리스트에 추가하고 이를 반환합니다.

 


  • 마무리
    이 문제를 푸는 중에 마지막에 날짜 비교를 어떻게 해야 편할 지에 대해 찾아보던 중 "모든 날짜 문제 단위를 통일해서 풀어라"라는 말을 발견했다. 이 문제 역시 단위를 통일해서 풀면 바로 풀리는 문제였다. 앞으로 날짜 문제를 보면 먼저 단위를 통일해야갰다는 생각을 해야겠다.
728x90
반응형