알고리즘/99Club

99클럽 코테 스터디 26일차 TIL + 개인정보 수집 유효기간 (문자열 파싱)

dami97 2024. 8. 16. 20:12
반응형

소개

  • 알고리즘 스터디를 참여하며 작성하는 TIL입니다.
  • TIL이란? 'Today I Learned'의 약자로, 한국어로 번역하면 '오늘 내가 배운 것'이란 의미입니다.
  • 제가 오늘 하루 배운 것 혹은 경험하고 느낀 것들을 기록하고 회고하는 습관을 기르기 위한 글입니다.

 

문제 & 키워드

  • 프로그래머스 - 개인정보 수집 유효기간 (문제 링크)
  • 날짜 처리
  • HashMap
  • 문자열 파싱

 


 

문제 설명

고객의 약관 동의를 얻어서 수집된 개인정보는 일정 기간 동안만 보관이 가능하며, 이 기간이 지나면 반드시 파기해야 합니다. 각 약관에는 보관할 수 있는 유효기간이 정해져 있습니다. 오늘 날짜와 각 약관의 유효기간, 그리고 개인정보 수집 일자 정보가 주어졌을 때, 오늘 날짜를 기준으로 파기해야 하는 개인정보들의 번호를 반환하는 문제입니다.

제한사항

  • 오늘 날짜는 "YYYY.MM.DD" 형식입니다.
  • 약관 유효기간은 여러 가지가 있으며, 각 약관의 이름과 유효기간이 주어집니다.
  • 개인정보는 약관에 따라 수집되며, 유효기간이 지난 개인정보는 파기해야 합니다.

입출력 예

예제 1

today = "2022.05.19"
terms = ["A 6", "B 12", "C 3"]
privacies = ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
Output: [1, 3]

예제 설명

오늘 날짜인 2022년 5월 19일 기준으로, 첫 번째 개인정보는 유효기간이 지나 파기해야 하며, 세 번째 개인정보 역시 유효기간이 지나 파기해야 합니다. 두 번째와 네 번째 개인정보는 유효기간이 지나지 않아 아직 보관 가능합니다.

 


 

문제 접근

이 문제는 주어진 날짜 정보를 활용하여 유효기간이 지났는지를 판단하는 문제입니다. 유효기간 계산을 위해, LocalDate를 사용하여 날짜를 처리하고, 약관의 유효기간 정보를 HashMap에 저장하여 각 개인정보의 유효기간이 지났는지를 계산합니다.

  1. 유효기간 정보 저장
    • terms 배열을 이용해 약관 이름과 그 유효기간(개월 수)을 HashMap에 저장합니다.
  2. 날짜 파싱
    • 오늘 날짜와 각 개인정보의 수집 날짜를 LocalDate로 변환합니다.
  3. 유효기간 계산
    • 개인정보의 수집 날짜에 해당 약관의 유효기간을 더해, 오늘 날짜와 비교하여 유효기간이 지났는지 확인합니다.
  4. 파기할 개인정보 결정
    • 유효기간이 지난 개인정보의 번호를 리스트에 추가하여 반환합니다.

 

풀이 - Java 코드

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {

    private int autoId = 1; // 개인정보 번호 자동 증가
    private LocalDate today; // 오늘 날짜

    public int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        HashMap<String, Integer> monthMap = new HashMap<>();
        this.today = dateParser(today);

        // 약관 유효기간 저장
        for (String t : terms) {
            String[] termsSplit = t.split(" ");
            String name = termsSplit[0];
            int month = Integer.parseInt(termsSplit[1]);
            monthMap.put(name, month);
        }

        // 개인정보 유효기간 확인
        for (String p : privacies) {
            String[] privaciesSplit = p.split(" ");
            String expireDay = privaciesSplit[0];
            int month = monthMap.get(privaciesSplit[1]);
            Privacy privacy = new Privacy(expireDay, month);

            if (privacy.isExpired()) {
                answer.add(privacy.getId());
            }
        }

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

    // 개인정보 클래스
    class Privacy {
        private int id;
        private String expireDay;
        private int plusMonth;

        public Privacy(String expireDay, int plusMonth) {
            this.id = autoId++;
            this.expireDay = expireDay;
            this.plusMonth = plusMonth;
        }

        public int getId() {
            return this.id;
        }

        public boolean isExpired() {
            LocalDate expiredDay = dateParser(this.expireDay).plusMonths(this.plusMonth);
            return expiredDay.isEqual(today) || expiredDay.isBefore(today);
        }
    }

    // 날짜 파서: "YYYY.MM.DD" 형식을 LocalDate로 변환
    private LocalDate dateParser(String date) {
        String[] split = date.split("\\\\\\\\.");
        int year = Integer.parseInt(split[0]);
        int month = Integer.parseInt(split[1]);
        int day = Integer.parseInt(split[2]);
        return LocalDate.of(year, month, day);
    }
}

풀이 설명

  1. 유효기간 정보 저장
    • terms 배열에서 약관 이름과 유효기간(개월 수)을 파싱해 HashMap에 저장합니다.
  2. 날짜 파싱
    • dateParser 메서드를 사용하여 YYYY.MM.DD 형식의 날짜 문자열을 LocalDate 객체로 변환합니다.
  3. 유효기간 계산
    • Privacy 객체 생성 시, 유효기간을 계산하기 위해 수집일자에 약관의 유효기간을 더한 날짜를 계산합니다.
    • 오늘 날짜와 비교하여 유효기간이 지났다면 파기 대상입니다.
  4. 결과 반환
    • 유효기간이 지난 개인정보의 번호를 리스트에 추가하고, 최종적으로 이를 배열로 변환하여 반환합니다.

 


 

마무리하며

  • 날짜 계산과 문자열 파싱을 활용하여 유효기간을 계산하는 방법으로 문제를 해결했습니다.
  • LocalDate를 활용한 날짜 처리와 HashMap을 데이터베이스 처럼 이용한 약관 유효기간 관리가 중요한 포인트였습니다.