Blog

프로그래머스 개인정보 수집 유효기간: 월 계산의 경계 처리하기

2023 KAKAO BLIND RECRUITMENT 문제 풀이입니다.

날짜를 나누어 비교했습니다

날짜 문자열을 연·월·일로 나누어 직접 비교하거나 한 달이 28일이라는 조건을 이용해 날짜를 일수로 바꿔 비교할 수 있습니다. 저는 첫 번째 방법으로 작성했습니다.

약관 종류별 유효기간을 맵에 저장합니다. 개인정보마다 수집 날짜와 약관 종류를 읽고 수집 월에 약관의 개월 수를 더합니다. 이렇게 구한 날짜부터는 보관할 수 없으므로 오늘이 그 날짜와 같아도 파기 대상입니다.

6월에서 18개월 뒤라면?

6월에 18개월을 더하면 계산 중의 월은 24가 됩니다. 이를 단순히 12로 나눈 나머지로 바꾸면 존재하지 않는 0월이 나옵니다.

그래서 더한 월이 12보다 클 때 두 경우로 나눴습니다. 나머지가 0이면 월을 12로 두고 연도에는 월 / 12 - 1을 더합니다. 나머지가 있으면 연도에 월 / 12를 더하고 월은 나머지로 바꿉니다. 24월은 이 계산으로 다음 해 12월이 됩니다.

checkDay()는 아직 보관할 수 있으면 true를 반환합니다. 연도, 월, 일 순서로 비교하고 만료일 당일을 포함해 기한이 지났다면 false입니다. 호출한 쪽에서는 false가 나온 개인정보의 번호를 1부터 세어 저장합니다.

당시 제출 코드

Java
import java.util.*;

class Solution {
    static HashMap<String, Integer> term = new HashMap<>();

    public int[] solution(String today, String[] terms, String[] privacies) {

        ArrayList<String> parsedToday = new ArrayList<>();

        ArrayList<Integer> answer = new ArrayList<>();

        StringTokenizer st = new StringTokenizer(today, ".");

        for (int i = 0; i < 3; i++){
            parsedToday.add(st.nextToken());
        }

        //임시 출력
        // for (String s : parsedToday){
        //         System.out.println(s);
        // }

        for(String str : terms){
            st = new StringTokenizer(str, " ");
            term.put(st.nextToken(), Integer.parseInt(st.nextToken()));
        }

        for(int i = 0; i < privacies.length; i++){
            st = new StringTokenizer(privacies[i], ". ");
            ArrayList<String> parsedPriv = new ArrayList<>();

            for (int j = 0; j < 4 ; j++){
                parsedPriv.add(st.nextToken());
            }
            if(!checkDay(parsedToday, parsedPriv)){
                answer.add(i+1);
            }

        }

        int[] result = new int[answer.size()];
        for(int i = 0; i < result.length ; i++){
            result[i] = answer.get(i);
        }

        return result;
    }

    static boolean checkDay(ArrayList<String> today, ArrayList<String> privDay){

        int todayY = Integer.parseInt(today.get(0));
        int todayM = Integer.parseInt(today.get(1));
        int todayD = Integer.parseInt(today.get(2));

        int privY = Integer.parseInt(privDay.get(0));
        int privM = Integer.parseInt(privDay.get(1)) + term.get(privDay.get(3));
        int privD = Integer.parseInt(privDay.get(2));

        if(privM > 12){
            if(privM % 12 == 0){
                privY += (privM / 12) - 1;
                privM = 12;
            } else {
                privY += (privM / 12);
                privM %= 12;
            }
        }

        int[] todayA = {todayY, todayM, todayD};
        int[] priv = {privY, privM, privD};

        if(todayY > privY) {
            return false;
        }
        if(todayY == privY && todayM > privM) {
            return false;
        }
        if(todayY == privY && todayM == privM && todayD >= privD) {
            return false;
        }
        return true;
    }
}