소개
- 알고리즘 스터디를 참여하며 작성하는 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에 저장하여 각 개인정보의 유효기간이 지났는지를 계산합니다.
- 유효기간 정보 저장
- terms 배열을 이용해 약관 이름과 그 유효기간(개월 수)을 HashMap에 저장합니다.
- 날짜 파싱
- 오늘 날짜와 각 개인정보의 수집 날짜를 LocalDate로 변환합니다.
- 유효기간 계산
- 개인정보의 수집 날짜에 해당 약관의 유효기간을 더해, 오늘 날짜와 비교하여 유효기간이 지났는지 확인합니다.
- 파기할 개인정보 결정
- 유효기간이 지난 개인정보의 번호를 리스트에 추가하여 반환합니다.
풀이 - 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);
}
}
풀이 설명
- 유효기간 정보 저장
- terms 배열에서 약관 이름과 유효기간(개월 수)을 파싱해 HashMap에 저장합니다.
- 날짜 파싱
- dateParser 메서드를 사용하여 YYYY.MM.DD 형식의 날짜 문자열을 LocalDate 객체로 변환합니다.
- 유효기간 계산
- Privacy 객체 생성 시, 유효기간을 계산하기 위해 수집일자에 약관의 유효기간을 더한 날짜를 계산합니다.
- 오늘 날짜와 비교하여 유효기간이 지났다면 파기 대상입니다.
- 결과 반환
- 유효기간이 지난 개인정보의 번호를 리스트에 추가하고, 최종적으로 이를 배열로 변환하여 반환합니다.
마무리하며
- 날짜 계산과 문자열 파싱을 활용하여 유효기간을 계산하는 방법으로 문제를 해결했습니다.
- LocalDate를 활용한 날짜 처리와 HashMap을 데이터베이스 처럼 이용한 약관 유효기간 관리가 중요한 포인트였습니다.
반응형