[Programmers] 개인정보 수집 유효기간

2023. 8. 2. 15:56Computer Sciences/Problem Solve

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

문제 이해 자체는 어렵지 않으나 날짜에 대한 처리를 잘 해야 하는 문제이다. 약관 종류와 약관 별 유효기간, 수집한 개인 정보의 수집 일자, 약관 종류, 오늘 날짜가 주어진다. 개인정보 수집 일자와 유효 기간을 더한 값이 오늘보다 더 긴 경우는 아직 유효기간이 지나지 않았으므로 파기하지 않는다. 대신 더 짧은 경우 유효 기간이 지났으므로 파기해야 한다. 이때 파기해야하는 개인정보 번호를 오름차순으로 반환해야 한다.

코드 1 - 스스로 푼 코드

처음에는 테스트케이스의 1번, 17번이 계속 통과되지 않아 질문을 보니 12월에 대한 처리가 잘못 되었음을 알았다. 이를 해결하는데 시간을 조금 썼다.

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        Map<String, Integer> termsMap = new HashMap<>();

        for (String term : terms) {
            String[] termDetails = term.split(" ");

            termsMap.put(termDetails[0], Integer.valueOf(termDetails[1]));
        }

        int index = 0;
        for (String privacy : privacies) {
            index++;
            String[] privacyDetails = privacy.split(" ");
            String collectDate = privacyDetails[0];

            String[] dateDetails = collectDate.split("\\.");
            int year = Integer.valueOf(dateDetails[0]);
            int month = Integer.valueOf(dateDetails[1]);
            int day = Integer.valueOf(dateDetails[2]);

            String kindOfTerm = privacyDetails[1];

            int validTerm = termsMap.get(kindOfTerm);

            month += validTerm;

            if (month >= 13) {
                if (month % 12 == 0) {
                    year = year + (month / 12) - 1;
                    month = 12;
                } else {
                    year = year + (month / 12);
                    month = month - 12 * (month / 12);
                }
            }

            String[] todayDetails = today.split("\\.");
            int todayYear = Integer.valueOf(todayDetails[0]);
            int todayMonth = Integer.valueOf(todayDetails[1]);
            int todayDay = Integer.valueOf(todayDetails[2]);

            if (todayYear < year) {
                continue;
            } else if (todayYear == year) {
                if (todayMonth < month) {
                    continue;
                } else if (todayMonth == month) {
                    if (todayDay < day) {
                        continue;
                    }
                }
            }

        answer.add(index);
    }

    return answer.stream().mapToInt(Integer::intValue).toArray();
}

문제를 풀긴 했으나 후련하지 않아 다른 사람의 풀이를 보았는데 날짜 처리를 모두 day로 변환하여 간단히 해결한 것을 보았다. 이를 적용한 코드는 다음과 같다.

코드 2 - 날짜를 day로 변환하여 처리

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

class Solution {
    
    private static final int DAY_OF_MONTH = 28;
    
    public int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        Map<String, Integer> termsMap = new HashMap<>();
        int todayDay = getDay(today);
        
        for (String term : terms) {
            String[] termDetails = term.split(" ");
            String kindOfTerm = termDetails[0];
            Integer period = Integer.valueOf(termDetails[1]);
            
            termsMap.put(kindOfTerm, period);
        }
        
        int index = 0;
        for (String privacy : privacies) {
            index++;
            String[] privacyDetails = privacy.split(" ");
            String collectDate = privacyDetails[0];
            String kindOfTerm = privacyDetails[1];
            int expireDay = getDay(collectDate) + (termsMap.get(kindOfTerm) * DAY_OF_MONTH);
            
            if (isExpire(expireDay, todayDay)) {
                answer.add(index);
            }
        }
        
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
    
    private boolean isExpire(int target, int today) {
        return target <= today;
    }
    
    private int getDay(String date) {
        String[] dateDetails = date.split("\\.");
        int year = Integer.parseInt(dateDetails[0]);
        int month = Integer.parseInt(dateDetails[1]);
        int day = Integer.parseInt(dateDetails[2]);
        return (year * 12 * DAY_OF_MONTH) + (month * DAY_OF_MONTH) + day;
    }
}