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

반응형

 

프로그래머스 programmers Level1 개인정보 수집 유효기간 - java 자바

 

 문제

2023 KAKAO BLIND RECRUITMENT

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 풀이

약관의 유효기간이 지나서 파기해야할 개인정보 번호를 구해야 한다.

  •  today   : 오늘 날짜를 의미하는 문자열
  •  terms  : 약관의 유효기간을 담은 1차원 문자열 배열
  •  privacies  : 수집된 개인정보의 정보를 담은 1차원 문자열 배열
  1. 약관의 종류별로 유효기간을 취득하기위해 약관 정보  terms Map 으로 변환해준다.
    (key : 약관 종류, value : 유효기간)
    Map<String, String> termsMap = new HashMap<>();
  2. 오늘 날짜를 총 날짜수로 변환해준다.
    Integer todayTotalDate = (  today 의 YYYY * 12 * 28) + ( today 의 MM * 28) +  today 의 DD
    약관이 유효한지 날짜를 확인하기위해 문자열(YYYY.MM.DD)을 Date 등으로 변환하거나 연, 월, 일을 따로 확인하는 방법보다 전체 날짜 수를 계산하는 방식을 사용했다.
    문제에서 한 달은 28일으로 주어지고 있으며, 약관의 유효기간은 달 수로 주어지기 때문에 유효기간을 고려했을때 연도 환산도 필요해져 버리기 때문이다. 그래서 다음과 같이 날짜 수로 변경하여 계산했다.
    ※ 연월일을 총 날짜수로 변환하는 식 :  (연도 * 12개월 * 28일) + (월 * 28일) + 일 
  3. 개인정보  privacies 배열을 하나씩 확인해가며 약관이 유효한지 만료되었는지 확인한다.
    1. 배열  privacies 에서  날짜  약관종류 를 분리하여 취득한다.
      공백으로 분리되어 있으므로 공백으로 자르면 인덱스 0은 날짜이며, 인덱스 1은 약관종류가 된다.
      String privateDate = privacies원소.split(" ")[0]; // 날짜
      String privateTerm = privacies원소.split(" ")[1]; // 약관종류
    2.  약관종류 Map에서  유효기간 을 취득한다.
      Integer termsMonth = Integer.valueOf(termsMap.get(privateTerm));
    3. 날짜의 달에 유효기간 달 수를 더해준다.
      Integer privateMonth = Integer.valueOf(privateDate.split("\\.")[1]) + termsMonth;
    4. 유효기간 경과후 총 날짜 수를 구한다.
      Integer privateTotalDate = (privateDate의 YYYY * 12 * 28) + (privateMonth * 28) + privateDate의 DD
    5. 계산된 전체 날짜 수를 바교하여 폐기대상인지를 확인한다.
       (유효기간을 고려한 약관 날짜 수 < today의 총 날짜수)
       이면, 폐기대상이다.
      if( privateTotalDate < todayTotalDate )  폐기대상 
      today 당일의 경우도 아직 유효기간이 지나지 않아 폐기대상이 아니므로  today 미만으로 계산한다.

 

■ java 코드

/**
 * 개인정보 수집 유효기간
 * @param today 오늘 날짜 YYYY.MM.DD
 * @param terms 약관의 유효기간 (약관종류 유효기간) : 공백으로 구분, 유효기간은 개월수
 * @param privacies 수집된 개인정보 (날짜 약관정보) : 공백으로 구분
 * @return 파기해야할 개인정보의 번호 오름차순
 */
public int[] solution(String today, String[] terms, String[] privacies) {
    int[] answer = {};
    Map<String, String> termsMap = new HashMap<>(); // key : 종류, value : 기간
    for (String term : terms) {
        String[] termSplit = term.split(" ");
        termsMap.put(termSplit[0], termSplit[1]);
    }

    Integer number = 1; // privacies 의 번호
    List<Integer> result = new ArrayList<>();
    // 현재 총 날짜 수
    Integer todayTotalDate = getTotalDate(today, 0);
    for (String p : privacies) {
        String[] privateSplit = p.split(" ");
        // 개인별 날짜
        String privateDate = privateSplit[0];
        // 개인별 약관 정보
        String privateTerm = privateSplit[1];
        // 약관 개월수
        Integer termsMonth = Integer.valueOf(termsMap.get(privateTerm));

        // 기간 경과 후 총 날짜 수
        Integer privateTotalDate = getTotalDate(privateDate, termsMonth) - 1; // 기간이므로 -1
        // 기간경과후 날짜가 현재 날짜보다 과거이면 폐기대상이다.
        if (privateTotalDate < todayTotalDate) { // 현재 당일은 아직 폐기대상 아님
            // 유효기간 경과하여 폐기대상인 번호를 추가
            result.add(number);
        }
        // privacies 의 번호 +1
        number++;
    }
    answer = result.stream().mapToInt(Integer::intValue).toArray();
    return answer;
}

/**
 * (YYYY.MM.DD)을 총 날짜 수로 환산
 * @param strDate YYYY.MM.DD
 * @param termsMonth 약관 개월 수
 * @return 날짜로 환산한 총 날짜 수
 */
private Integer getTotalDate(String strDate, Integer termsMonth) {
    // 날짜 정보
    String[] dateSplit = strDate.split("\\.");
    Integer year = Integer.valueOf(dateSplit[0]);
    Integer month = Integer.valueOf(dateSplit[1]) + termsMonth;
    Integer day = Integer.valueOf(dateSplit[2]);

    // 모두 일 수로 환산, 한 달은 28일
    return (year * 12 * 28) + (month * 28) + day;
}
반응형