본문 바로가기

코딩테스트/JAVA

[프로그래머스 JAVA] Lv.1 개인정보 수집 유효기간

문제 요약

오늘 날짜(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일 고정이라는 조건을 보고 총 일수로 변환하는 방법을 떠올리자 바로 정리됐다.

날짜 문제는 이렇게 “단위 통일 후 단순 비교”로 푸는 게 가장 깔끔하다는 걸 다시 한 번 느낌