문제 요약
오늘 날짜(today), 약관 종류(terms), 그리고 개인정보 수집 일자(privacies)가 주어진다.
각 약관마다 보관 가능한 개월 수가 다르며,
보관 기간이 지난 개인정보는 파기 대상이 된다.
단, 모든 달은 28일로 고정된 달력을 사용한다는 점이 핵심 조건이다.
즉, 윤년이나 달의 일 수는 고려하지 않는다.
접근 방식
이 문제는 날짜 계산을 단순하게 하기 위해
각 날짜를 총 일수 단위로 변환해서 비교하는 것이 포인트다.
핵심 아이디어
- 1년 = 12개월 = 12 × 28일
- 따라서 YYYY.MM.DD → (YYYY * 12 * 28) + (MM * 28) + DD 로 변환
- 수집일 + (약관개월 * 28) <= 오늘일수 이면 만료
이렇게 하면 연/월/일 비교나 “하루 전” 처리 같은 복잡한 분기가 사라진다.
import java.util.*;
import java.io.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
StringTokenizer st;
List<Integer> list = new ArrayList<>();
// 1. 오늘 날짜를 일수로 변환
int todate = toDays(today);
// 2. 약관 정보를 해시맵에 저장 (약관명 -> 개월수)
HashMap<Character, Integer> term = new HashMap<>();
for(int i = 0; i < terms.length; i++){
st = new StringTokenizer(terms[i]);
char c = st.nextToken().charAt(0);
int a = Integer.parseInt(st.nextToken());
term.put(c, a);
}
// 3. 개인정보를 하나씩 검사
for(int i = 0; i < privacies.length; i++){
st = new StringTokenizer(privacies[i]);
int day = toDays(st.nextToken());
int plus = term.get(st.nextToken().charAt(0));
day += plus * 28;
if(day <= todate){
list.add(i + 1); // 문제는 1-based index
}
}
// 4. 결과 변환
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
// 날짜를 총 일수로 변환
public static int toDays(String date){
String[] T = date.split("\\.");
int year = Integer.parseInt(T[0]);
int month = Integer.parseInt(T[1]);
int day = Integer.parseInt(T[2]);
return year * 12 * 28 + month * 28 + day;
}
}
회고
처음엔 단순히 “연, 월, 일”로 비교하려다 조건이 꼬이기 시작했는데,
28일 고정이라는 조건을 보고 총 일수로 변환하는 방법을 떠올리자 바로 정리됐다.
날짜 문제는 이렇게 “단위 통일 후 단순 비교”로 푸는 게 가장 깔끔하다는 걸 다시 한 번 느낌
'코딩테스트 > JAVA' 카테고리의 다른 글
| [프로그래머스 JAVA] Lv.3 표현 가능한 이진트리 (0) | 2025.10.09 |
|---|---|
| [프로그래머스 JAVA] Lv.2 이모티콘 할인행사 (0) | 2025.10.09 |
| [백준 JAVA] 17144번: 미세먼지 안녕! (0) | 2025.10.02 |
| [백준 JAVA] 15686번: 치킨배달 (0) | 2025.10.02 |
| [백준 JAVA] 14719번: 빗물 (0) | 2025.10.02 |