본문 바로가기

프로그래머스(Java)/Level 1

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

728x90

코드 힌트

  1. 약관 유효기간 매핑:
    • 주어진 약관 종류와 그에 따른 유효기간을 매핑하여, 각 약관이 몇 개월 동안 유효한지 저장합니다.
    • 이 매핑은 나중에 개인정보의 유효기간을 계산할 때 사용됩니다.
  2. 유효기간 계산 및 만료 확인:
    • 각 개인정보의 수집일자와 약관 종류를 바탕으로, 해당 개인정보가 오늘 날짜를 기준으로 만료되었는지를 확인합니다.
    • 만약 유효기간이 지나면 만료된 것으로 간주하고 결과 리스트에 해당 개인정보의 인덱스를 저장합니다.
    • 개인정보를 저장할 수 있는 달의 정수의 범위는 1~100입니다. month, year를 잘 관리하셔야합니다.
  3. 결과 배열 생성:
    • 만료된 개인정보의 인덱스를 저장한 리스트를 배열로 변환하여 최종 결과로 반환합니다.

 

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        // 약관의 종류와 유효기간을 매핑하는 HashMap 생성
        HashMap<String, Integer> termDurationMap = initTermDurationMap(terms);
        
        List<Integer> list = new ArrayList<>();
        // 각 개인정보에 대해 유효기간이 지났는지 확인
        for (int i = 0; i < privacies.length; i++) {
            String[] privacyInfo = privacies[i].split(" ");
            
            if (isExpired(privacyInfo, today, termDurationMap)) {
                list.add(i + 1); // 만료된 경우 해당 번호 추가
            }
        }
        
        // 결과 배열 생성
        int[] result = new int[list.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = list.get(i);
        }
        return result;
    }
    
    // 유효 기간이 지났는지 여부를 확인하는 메서드
    public boolean isExpired(String[] privacyInfo, String today, HashMap<String, Integer> termDurationMap) {
        // 오늘 날짜 분할 (년, 월, 일)
        String[] todayParts = today.split("\\.");
        int todayYear = Integer.parseInt(todayParts[0]);
        int todayMonth = Integer.parseInt(todayParts[1]);
        int todayDay = Integer.parseInt(todayParts[2]);
        
        // 수집 일자 분할 (년, 월, 일)
        String[] startDateParts = privacyInfo[0].split("\\.");
        int startYear = Integer.parseInt(startDateParts[0]);
        int startMonth = Integer.parseInt(startDateParts[1]);
        int startDay = Integer.parseInt(startDateParts[2]);

        // 약관 종류에 따른 유효기간 계산 (월 단위)
        int validityPeriod = termDurationMap.get(privacyInfo[1]);
        startMonth += validityPeriod; // 시작 월에 유효기간 더하기
        while (startMonth > 12) {
            startMonth -= 12; // 12월을 넘으면 다음 해로 넘기기
            startYear++;
        }
        
        // 유효기간이 지났는지 확인
        if (todayYear > startYear) { // 오늘의 연도가 더 크면 만료
            return true;
        } else if (todayYear == startYear && todayMonth > startMonth) { // 같은 연도에서 오늘의 월이 더 크면 만료
            return true;
        } else if (todayYear == startYear && todayMonth == startMonth && todayDay >= startDay) { // 같은 월에서 오늘의 일이 같거나 더 크면 만료
            return true;
        }
        
        return false; // 만료되지 않은 경우
    }
    
    // 약관 종류와 기간을 매핑하는 메서드
    public HashMap<String, Integer> initTermDurationMap(String[] terms) {
        HashMap<String, Integer> map = new HashMap<>();
        
        // 약관과 유효기간을 분할하여 맵에 저장
        for (String term : terms) {
            String[] termParts = term.split(" ");
            String termType = termParts[0]; // 약관 종류
            int durationInMonths = Integer.parseInt(termParts[1]); // 유효기간 (월 단위)
            map.put(termType, durationInMonths);
        }
        return map;
    }
}
728x90