-
개인정보 수집 유효기간 풀이(2023 KAKAO BLIND RECRUITMENT)수학과 알고리즘/알고리즘 공부 2023. 1. 19. 02:03
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 전체 코드
def solution(today, terms, privacies): today = list(map(int, today[2:].split('.'))) today = (28 * 12 * today[0]) + 28 * today[1] + today[2] terms = [data.split() for data in terms] month = {x: int(y) * 28 for x, y in terms} privacies = [data.split() for data in privacies] privaciesStd = [y for x, y in privacies] privaciesDate = [list(map(int, x[2:].split('.'))) for x, y in privacies] privaciesDate = [(28 * 12 * i) + (28 * j) + k for i, j, k in privaciesDate] answer = [] count = 0 for promise, deadline in zip(privaciesStd, privaciesDate): count += 1 if (deadline + month[promise]) <= today: answer.append(count) return answer
2. 문제 이해하기
문제에서 신경쓸 부분은 3개라고 본다.
1. 한달은 28일이다. 즉, datetime 같은 라이브러리를 쓸 이유가 없다
2. 일자를 넘어가면 개인정보를 파기한다. 즉, 유효기간 + 계약일자 <= 오늘 날짜이다.
3. 유효기간은 약관 별로 다르다.3. 푼 컨셉
전체적인 컨셉 : 연, 월, 일을 전부 일자로 변환한 다음 크기를 비교한다.
해당 컨셉이 가능한 이유는 한달이 28일이기 때문이다.# 오늘 날짜를 정수 리스트로 변환해준 다음, 일자로 변환 today = list(map(int, today[2:].split('.'))) today = (28 * 12 * today[0]) + 28 * today[1] + today[2]
#유효 기간 문자열을 일자 변환 후 딕셔너리로 변환 #차후에 딕셔너리는 날짜 계산에 쓰임 terms = [data.split() for data in terms] month = {x: int(y) * 28 for x, y in terms}
# '계약기간 약관유형'으로 되어있는 문자열을 분해하여 일자 리스트와 약관 리스트로 만듬 # 두 리스트는 같은 순서를 공유 privacies = [data.split() for data in privacies] privaciesStd = [y for x, y in privacies] privaciesDate = [list(map(int, x[2:].split('.'))) for x, y in privacies] privaciesDate = [(28 * 12 * i) + (28 * j) + k for i, j, k in privaciesDate]
# 일자 비교를 위해 딕셔너리로 만들었던 유효기간 + 계약일자를 더함 # 더한 값을 today와 비교하여 해당하는 경우의 index만 정답 리스트에 추가 answer = [] count = 0 for promiseType, promiseDate in zip(privaciesType, privaciesDate): count += 1 if (promiseDate + month[promiseType]) <= today: answer.append(count) return answer
4. 느낀 점
그렇게 어려운 문제는 아니었지만 꼼꼼하지 못해 시간이 걸렸던 것 같다.
풀이 방법을 3개쯤 생각해봤다가 결국 마지막 방법으로 풀었는데,
첫번째는 한달이 28일인 것을 몰라 datetime로 풀려고 했었으나 문제를 다시 읽어보면서 틀린 것을 알았고,
두번째는 단순하게 문자열 비교를 통해 True, False를 추출하려고 해봤는데 유효기간을 더하는 것 때문에 기각했다.
마지막은 단순하게 월, 일, 시를 담아서 비교하는 식으로 해결하면 편했겠지만 앞선 방법들에서 머리를 다 썼는지 잘 생각나지 않아서 최대한 단순하게 비교해보려고 연월일을 일자로 전부 통일해서 해결했다.
그렇게까지 어려웠던 문제는 아니었지만 다른 사람들의 방법을 보니 그리 특별하지 않았던 것 같기도 하지만, 항상 문제를 풀다보면 어떻게하면 쉽게 풀 수 있을지, 설명을 잘할 수 있을지 고민을 많이 하는 편인데 이 방법이 고민이 잘 반영된 풀이방법이었으면 좋겠다.
리스트 컴프리헨션과 푼 컨셉 정도만 아는 수준이라면 쉽게 이해할 수 있는 수준이라고 생각한다.'수학과 알고리즘 > 알고리즘 공부' 카테고리의 다른 글
프로그래머스 1레벨 완료 후 2레벨 도전 중 (0) 2023.06.26 프로그래머스 0레벨 완료 후 1레벨 도전 중 (0) 2023.01.19 프로그래머스 레벨 0 완료 (0) 2022.12.02 Codeup python 100제 완료 소감 (0) 2022.01.26