프로그래밍/코딩 테스트, 더 이상 미룰 수 없다

[코테대비] 프로그래머스 Lv1 - 개인정보 수집 유효기간 (첫 풀이)

d 0_0 b 2026. 6. 26. 00:30

 

이번 문제는 날짜를 어떻게 다룰 것인지가 핵심이었다.

처음에는 날짜를 문자열로 비교하려고 했고, 이후에는 연도, 월, 일을 각각 나누어 비교하는 방식으로 접근했다.

처음 접근

먼저 약관 정보를 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)

연도가 다르면 월과 일을 볼 필요가 없고,

연도가 같을 때만 월,

월도 같을 때만 일을 비교하는 방식이다.


디버깅하면서 느낀 점

이번 문제를 풀면서 가장 많이 배운 것은 테스트케이스가 실패했을 때의 접근 방법이었다.

예전에는 코드를 계속 수정했는데, 이번에는 먼저 아래 순서대로 확인하려고 했다.

  1. 문제 조건을 다시 읽는다.
  2. 손으로 예제를 계산한다.
  3. print()로 중간 값을 확인한다.
  4. 예외 케이스를 만든다.
  5. 구현보다 더 단순한 방법이 있는지 고민한다.

특히

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시간, 초 단위 등)이 고정되어 있다면 하나의 숫자로 변환하는 접근을 먼저 떠올리기