
이번 문제는 날짜를 어떻게 다룰 것인지가 핵심이었다.
처음에는 날짜를 문자열로 비교하려고 했고, 이후에는 연도, 월, 일을 각각 나누어 비교하는 방식으로 접근했다.
처음 접근
먼저 약관 정보를 Dictionary로 변환했다.
term_dict = {}
for term in terms:
kind, month = term.split()
term_dict[kind] = int(month)
이렇게 만들어두면
term_dict["A"]
처럼 바로 유효기간을 가져올 수 있다.
개인정보 하나씩 처리
개인정보는
2021.05.02 A
형태이므로 먼저 날짜와 약관을 분리했다.
date, term = privacie.split()
그리고 날짜를 다시 연, 월, 일로 나누었다.
year, month, day = date.split(".")
year = int(year)
month = int(month)
day = int(day)
여기서 처음 실수했던 부분은 split으로 나눈 값은 모두 문자열이라는 점이었다.
날짜 계산을 하려면 반드시 int()로 변환해야 한다.
개월 수 더하기
처음에는 단순히
month += term_dict[term]
후
if month > 12:
month %= 12
year += 1
처럼 처리했다.
하지만 이 방식은 일반화되지 않는다.
예를 들어
11월 + 14개월
처럼 12개월을 여러 번 넘는 경우가 생기면 조건을 계속 추가해야 한다.
결국 다음과 같이 수정했다.
year += (month - 1) // 12
month = (month - 1) % 12 + 1
이 방식은 월이 몇 개월이 되든 항상 올바른 연도와 월을 계산할 수 있다.
앞으로 개월 계산이 필요한 문제에서는 자주 사용할 수 있는 패턴이라고 생각한다.
날짜 비교
날짜는
Year
↓
Month
↓
Day
순서대로 비교했다.
if t_year > year:
answer.append(index)
elif t_year == year:
if t_month > month:
answer.append(index)
elif t_month == month:
if t_day >= day:
answer.append(index)
연도가 다르면 월과 일을 볼 필요가 없고,
연도가 같을 때만 월,
월도 같을 때만 일을 비교하는 방식이다.
디버깅하면서 느낀 점
이번 문제를 풀면서 가장 많이 배운 것은 테스트케이스가 실패했을 때의 접근 방법이었다.
예전에는 코드를 계속 수정했는데, 이번에는 먼저 아래 순서대로 확인하려고 했다.
- 문제 조건을 다시 읽는다.
- 손으로 예제를 계산한다.
- print()로 중간 값을 확인한다.
- 예외 케이스를 만든다.
- 구현보다 더 단순한 방법이 있는지 고민한다.
특히
print(year, month, day)
를 출력해 보면서 계산이 어디서 틀렸는지 확인하는 습관이 생각보다 큰 도움이 됐다.
이번 문제에서 배운 점
처음에는 if를 계속 추가해서 해결하려고 했다.
하지만 구현 문제에서는 예외 처리를 늘리는 것보다 계산 자체를 일반화할 수 있는지 먼저 생각해야 한다.
이번 문제에서는
year += (month - 1) // 12
month = (month - 1) % 12 + 1
처럼 일반화된 계산식을 사용하는 것이 훨씬 깔끔한 해결 방법이었다.
다만 이 문제는 '모든 달은 28일', '만료일은 하루 전'이라는 조건을 이용하면 날짜를 하나의 숫자로 변환해 더 간단하게 풀 수도 있다.
이번에는 연도, 월, 일을 직접 비교하는 방식으로 구현했지만, 다음에는 날짜를 숫자로 변환하는 풀이도 직접 구현해 보면서 두 가지 접근을 모두 익혀볼 생각이다.
다음에 일자를 고정하는 유형을 만나면
문제에서 "모든 달은 28일"이라고 조건을 준 이유는 날짜를 하나의 숫자로 변환하라는 힌트에 가깝다.
예를 들어
date_num = year * 12 * 28 + month * 28 + day
처럼 날짜를 하나의 정수로 변환하면,
- 날짜 비교는 숫자 비교 한 번으로 끝나고,
- 연도, 월, 일을 따로 비교할 필요도 없으며,
- 예외 처리도 크게 줄어든다.
이번 문제를 통해 얻은 가장 큰 복습 포인트는 다음과 같다.
- 문제를 그대로 구현하기 전에 더 단순한 형태로 바꿀 수 있는지 먼저 생각하기
- 날짜처럼 기준(28일, 24시간, 초 단위 등)이 고정되어 있다면 하나의 숫자로 변환하는 접근을 먼저 떠올리기
'프로그래밍 > 코딩 테스트, 더 이상 미룰 수 없다' 카테고리의 다른 글
| [코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv1 - 달리기 경주(Python으로 양방향 매핑 문제) (0) | 2026.06.27 |
|---|---|
| [코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스 Lv1 - 신고 결과 받기 (0) | 2026.06.26 |
| [코딩테스트, 더 이상 미룰 수 없다] BOJ 14891 - 구현, 실행의 판단 파트와 실제 실행파트 구분하기 (0) | 2026.04.02 |
| [코딩테스트, 더 이상 미룰 수 없다] BOJ 14501 - 코드를 외워둘 만한 대표적 DP 문제 (0) | 2026.03.31 |
| [코딩테스트, 더 이상 미룰 수 없다] BOJ 14502 연구소 - 구현을 감 잡아보zㅏ (0) | 2026.03.30 |