[level 1] 개인정보 수집 유효기간 - 150370
성능 요약
메모리: 10.5 MB, 시간: 0.25 ms
구분
코딩테스트 연습 > 2023 KAKAO BLIND RECRUITMENT
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2024년 1월 2일 1:12:47
문제 설명
고객의 약관 동의를 얻어서 수집된 1~n
번으로 분류되는 개인정보 n
개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
모든 달은 28일까지 있다고 가정합니다.
다음은 오늘 날짜가 2022.05.19
일 때의 예시입니다.
약관 종류 | 유효기간 |
---|---|
A | 6 달 |
B | 12 달 |
C | 3 달 |
번호 | 개인정보 수집 일자 | 약관 종류 |
---|---|---|
1 | 2021.05.02 |
A |
2 | 2021.07.01 |
B |
3 | 2022.02.19 |
C |
4 | 2022.02.20 |
C |
- 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
- 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
- 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
- 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.
오늘 날짜를 의미하는 문자열 today
, 약관의 유효기간을 담은 1차원 문자열 배열 terms
와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies
가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
today
는 "YYYY
.MM
.DD
" 형태로 오늘 날짜를 나타냅니다.- 1 ≤
terms
의 길이 ≤ 20terms
의 원소는 "약관 종류
유효기간
" 형태의약관 종류
와유효기간
을 공백 하나로 구분한 문자열입니다.약관 종류
는A
~Z
중 알파벳 대문자 하나이며,terms
배열에서약관 종류
는 중복되지 않습니다.유효기간
은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
- 1 ≤
privacies
의 길이 ≤ 100privacies[i]
는i+1
번 개인정보의 수집 일자와 약관 종류를 나타냅니다.privacies
의 원소는 "날짜
약관 종류
" 형태의날짜
와약관 종류
를 공백 하나로 구분한 문자열입니다.날짜
는 "YYYY
.MM
.DD
" 형태의 개인정보가 수집된 날짜를 나타내며,today
이전의 날짜만 주어집니다.privacies
의약관 종류
는 항상terms
에 나타난약관 종류
만 주어집니다.
today
와privacies
에 등장하는날짜
의YYYY
는 연도,MM
은 월,DD
는 일을 나타내며 점(.
) 하나로 구분되어 있습니다.- 2000 ≤
YYYY
≤ 2022 - 1 ≤
MM
≤ 12 MM
이 한 자릿수인 경우 앞에 0이 붙습니다.- 1 ≤
DD
≤ 28 DD
가 한 자릿수인 경우 앞에 0이 붙습니다.
- 2000 ≤
- 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.
입출력 예
today | terms | privacies | result |
---|---|---|---|
"2022.05.19" |
["A 6", "B 12", "C 3"] |
["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"] |
[1, 3] |
"2020.01.01" |
["Z 3", "D 5"] |
["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"] |
[1, 4, 5] |
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
약관 종류 | 유효기간 |
---|---|
Z | 3 달 |
D | 5 달 |
번호 | 개인정보 수집 일자 | 약관 종류 |
---|---|---|
1 | 2019.01.01 |
D |
2 | 2019.11.15 |
Z |
3 | 2019.08.02 |
D |
4 | 2019.07.01 |
D |
5 | 2018.12.28 |
Z |
오늘 날짜는 2020년 1월 1일입니다.
- 첫 번째 개인정보는 D약관에 의해 2019년 5월 28일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
- 두 번째 개인정보는 Z약관에 의해 2020년 2월 14일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
- 세 번째 개인정보는 D약관에 의해 2020년 1월 1일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
- 네 번째 개인정보는 D약관에 의해 2019년 11월 28일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
- 다섯 번째 개인정보는 Z약관에 의해 2019년 3월 27일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
풀이
def solution(today, terms, privacies):
answer = []
dict = {term[0]: int(term[1:]) for term in terms}
for idx, splitt in enumerate(privacies):
data = splitt.split('.')
privacies[idx] = data
for d in privacies:
temp = d[-1].split(' ')
d.pop()
d.append(temp[0])
d.append(temp[1])
for check in privacies:
if int(check[1]) + dict[check[3]] > 12 and (int(check[1]) + dict[check[3]]) % 12 != 0:
check[0] = int(check[0]) + (int(check[1]) + dict[check[3]])//12
check[1] = (int(check[1]) + dict[check[3]]) % 12
if int(check[2]) - 1 == 0:
check[1] -= 1
check[2] = 28
else:
check[2] = int(check[2]) - 1
elif int(check[1]) + dict[check[3]] > 12 and (int(check[1]) + dict[check[3]]) % 12 == 0:
check[0] = int(check[0]) + (dict[check[3]] + int(check[1])) // 12 - 1
check[1] = 12
check[2] = int(check[2])
if int(check[2]) - 1 == 0:
check[1] -= 1
check[2] = 28
else:
check[2] = int(check[2]) - 1
else:
check[0] = int(check[0])
check[1] = int(check[1]) + dict[check[3]]
if int(check[2]) - 1 == 0:
check[1] -= 1
check[2] = 28
else:
check[2] = int(check[2]) - 1
today = [int(x) for x in today.split('.')]
for idx, person in enumerate(privacies):
if person[0] - today[0] > 0:
pass
elif person[0] - today[0] >= 0 and person[1] - today[1] > 0:
pass
elif person[0] - today[0] >= 0 and person[1] - today[1] >= 0 and person[2] - today[2] >= 0:
pass
else:
answer.append(idx + 1)
return answer
느낀점
나의 경우에는 일반적인 케이스 ex) 달과 달을 더해서 24로 나누었을 때, 몫 만큼 년도에 더하고 달은 나머지로 구하는 방식으로 접근했다. 여기에서 가장 큰 이슈는 예외 케이스에 대한 생각을 전혀 하지 못했다는 점이다. 예를 들어, 2001.11.01 이란 날짜가 주어지고 계약 기간은 A 13이라고 가정했을 때, 2002.12.01이 되어야 맞는건데 24 % 12로 코드를 작성해서 달에서 오류가 났었고, 달을 제대로 고치면 년도에 더하는 과정에서 오류가 났었다.
지금 해당 문제를 다시 돌이켜 봤을 때, 실수를 하거나 중간에 한번 막혀서 생각을 해야하는 과정이 찾아오면 코드의 가독성이 좋지 않아서 내가 작성한 것이지만 다시 한번 무슨 코드인지 읽어보는 시간이 있었다. 따라서 앞으로 코드를 작성할 때는 조금 더 변수명과 주석처리 등을 이용해서 조금 더 가독성이 있게끔 작성해야 겠다는 생각이 깊이 들었다.
추가적으로 해당 문제를 조금 더 효율적으로 풀기 위해서는(개인적인 생각이지만) 년/월/일로 받아들이고 문제를 푸는 것 보다, 주어진 문제에서 day는 무조건 28일 이라고 명시했기 때문에 년2812 + 월*28 + 일로 day의 수를 계산해서 today와 비교하는게 더 좋아보인다고 생각한다.
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
'알고리즘' 카테고리의 다른 글
프로그래머스: 신고 결과 받기 (0) | 2024.01.23 |
---|---|
프로그래머스: 공원 산책 (1) | 2024.01.23 |
프로그래머스: 바탕화면 정리 (0) | 2024.01.19 |
프로그래머스: 데이터 분석 (0) | 2024.01.18 |
프로그래머스: 성격 유형 검사하기 (1) | 2024.01.18 |