2024년 4월 20일 토요일

2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/150370

파이썬 소스: https://bit.ly/3JpniM3

 

문제에서 주어지는 YYYY.MM.DD형태의 날짜를 숫자형태로 변환해야, today변수로 주어지는 날짜와 비교해서 파기해야 할 개인정보인지 알 수 있습니다. 연월일을 숫자로 변환하는 함수부터 코딩해보겠습니다.

def ymd2int(ymd: str) -> int:
    y, m, d = ymd.split(
'.')
    y =
int(y) * 12 * 28
   
m = int(m[0]) * 10 + int(m[1])
    m *=
28
   
d = int(d[0]) * 10 + int(d[1])
   
return y + m + d

‘.’를 기준으로 YYYY.MM.DD를 나눠서 y, m, d 변수에 저장합니다.

변수 y 2000부터 시작하기 때문에, 스트링 y의 앞쪽에 0으로 시작하는 경우가 없어서, int()를 사용해서 숫자로 변환하고, 연도에 해당하는 일 수를 계산하기 위해서 * 12 개월 해주고, 매달 * 28일을 곱해줍니다.

변수 m은 인덱스 0번째 문자가 0이 될 수 있기 때문에, m[0] m[1] 따로 숫자로 변환하구요, m[0[‘0’스트링인 경우 0이 됨으로, int(‘0’)한 값은 숫자 0이 됩니다. m[0]을 숫자로 변환한 값은 10의 자리 이기 때문에, 10을 곱해주고, m[1]를 숫자로 변환해서 서로 더해줍니다. 마지막으로, 매달 * 28일을 곱해줍니다.

변수 d m에서 인덱스 0을 고려해서 숫자로 변환했던 것처럼, 숫자로 변환해줍니다.

y + m + d 3개의 변수를 더하면, 연월일을 숫자로 변환한 값이 됩니다.

def solution(today: str, terms: List, privacies: List[str]):
    today = ymd2int(today)

오늘 날짜인 today를 연월일에서 숫자로 변환합니다.

약관을 처리할 차례입니다.

dict_terms = defaultdict(int)
for term in terms:
    yakkwan, yuhyo = term.split(
' ')
    dict_terms[yakkwan] =
int(yuhyo.split(' ')[0]) * 28

약관 종류(A, B, C …)을 키로 사용해서, 유효기간을 저장할 딕셔너리 dict_terms 변수를 만듭니다.

각 약관을 약관 종류와 유효기간으로 ‘ ‘을 사용해서 나눠줍니다.

키로 사용될 yakkwan은 딕셔너리의 키로 사용하구요, 유효기간은 다시 ‘ ‘ 기준으로 숫자달과 스트링 로 나눕니다. 숫자달은 숫자로 변환한 뒤 * 28일을 해서 달을 일수로 변환합니다.

개인정보를 처리해보겠습니다.

for idx in range(len(privacies)):
    ymd, yakkwan = privacies[idx].split(
' ')
    privacies[idx] = [idx +
1, (ymd2int(ymd) + dict_terms[yakkwan])]

리스트 privacies의 길이만큼 for 루프가 동작합니다. ‘ ‘을 기준으로 연월일과 약관 종류로 나눠줍니다.

변수 idx0부터 시작하지만, 결과 값을 리턴 할 때는 1부터 시작하는 순서로 리턴 해야 하기에, +1을 해줍니다.

개인정보가 수집 일자를 숫자로 변환하고, 약관에 따른 유효기간을 더해줍니다.

문제를 풀기 위해서, 데이터를 변환 및 처리하는 과정이 끝났습니다.

답을 구하려면, 파기해야 하는 개인정보를 가려내야 합니다.

privacies = list(filter(lambda privacy: privacy[1] <= today, privacies))

개인정보 수집일자와 약관에 따른 유효기간이 지난 개인정보의 숫자는 today숫자보다 작거나 같습니다. 함수 filter lambda식을 사용해서, 해당 개인정보를 privacies에 저장합니다. 함수 filter의 리턴값은 리스트가 아니기 때문에, list()를 사용해서 리스트 변수로 변환합니다. 리스트 privacies에는 파기해야 할 개인정보만 남아 있습니다.

 

문제에서 아래와 같이 정렬해달라고 기술하고 있습니다.

이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

따라서, 이제 날짜는 필요가 없고, 개인정보의 번호만 필요합니다.

answer = list(map(lambda privacy: privacy[0], privacies))

함수 map() lambda식을 사용해서 개인정보의 번호만 남겨두고, 날짜는 삭제한 리스트를 answer에 저장합니다.

마지막으로 오름차순으로 정렬합니다.

answer.sort()

개인정보의 번호를 가지고 있는 리스트 answer를 리턴하면, 문제의 답을 구할 수 있습니다.

 

궁금한 내용은 댓글, 이메일(coding.data.pul@gmail.com)로 보내주세요.

코데풀 유튜브 구독 부탁드립니다.

https://www.youtube.com/@codapul

 

전체 코드는 아래에 있습니다.

from collections import defaultdict
from typing import List


def solution(today: str, terms: List, privacies: List[str]):
    today = ymd2int(today)
    dict_terms = defaultdict(
int)
   
for term in terms:
        yakkwan, yuhyo = term.split(
' ')
        dict_terms[yakkwan] =
int(yuhyo.split(' ')[0]) * 28

   
for idx in range(len(privacies)):
        ymd, yakkwan = privacies[idx].split(
' ')
        privacies[idx] = [idx +
1, (ymd2int(ymd) + dict_terms[yakkwan])]

    privacies =
list(filter(lambda privacy: privacy[1] <= today, privacies))
    answer =
list(map(lambda privacy: privacy[0], privacies))
    answer.sort()

   
return answer


def ymd2int(ymd: str) -> int:
    y, m, d = ymd.split(
'.')
    y =
int(y) * 12 * 28
   
m = int(m[0]) * 10 + int(m[1])
    m *=
28
   
d = int(d[0]) * 10 + int(d[1])
   
return y + m + d

 

 

댓글 없음:

댓글 쓰기