이번 문제는 각 개인정보의 유효기간을 계산하여, 주어진 날짜와 비교 후 지워야 할 데이터를 선별하는 것이다.
이번 문제를 풀기위해 DateTimeFormatter와 LocalDate 객체를 사용했다.
유효기간 Map객체에 매핑 : 유효기간을 terms 배열에서 termMap에 저장한다. Key는 약관, value는 유효기간으로 저장한다.
Map<String, Integer> termMap = new HashMap<>();
for(int i = 0; i < terms.length; i++) {
termMap.put(terms[i].split(" ")[0], Integer.parseInt(terms[i].split(" ")[1]));
}
개인정보 검토 및 파기 대상 식별 :
- 개인정보의 약관 종류와 수집 일자를 파악한다.
- 해당 약관의 유효기간을 termMap에서 조회하여 수집 일자에 추가한다.
- 유효기간이 오늘 날짜 이전이거나 같은 경우, 해당 개인정보를 파기 대상으로 분류한다.
for(int i = 1; i <= privacies.length; i++) {
String type = privacies[i - 1].split(" ")[1];
String date = privacies[i - 1].split(" ")[0];
int limitTerm = termMap.get(type);
LocalDate limit = LocalDate.parse(date, formatter).plusMonths(limitTerm);
if(!limit.isAfter(criteria)) {
deleteList.add(i);
}
}
결과 반환 : 파기해야할 개인정보 번호를 리스트에서 배열로 변환해 반환한다.
int[] answer = new int[deleteList.size()];
for(int i = 0; i < deleteList.size(); i++) {
answer[i] = deleteList.get(i);
}
return answer;
이번 문제를 풀 때의 핵심은 DateTimeFormatter와 LocalDate를 활용해 비교 로직을 빠르게 처리하는 것이라고 생각한다.
전체코드는 아래와 같다.
import java.time.*;
import java.time.format.*;
import java.util.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
LocalDate criteria = LocalDate.parse(today, formatter);
ArrayList<Integer> deleteList = new ArrayList<>();
Map<String, Integer> termMap = new HashMap<>();
for(int i = 0; i < terms.length; i++) {
termMap.put(terms[i].split(" ")[0], Integer.parseInt(terms[i].split(" ")[1]));
}
for(int i = 1; i <= privacies.length; i++) {
String type = privacies[i - 1].split(" ")[1];
String date = privacies[i - 1].split(" ")[0];
int limitTerm = termMap.get(type);
LocalDate limit = LocalDate.parse(date, formatter);
limit = limit.plusMonths(limitTerm);
if(!limit.isAfter(criteria)) {
deleteList.add(i);
}
}
int[] answer = new int[deleteList.size()];
for(int i = 0; i < deleteList.size(); i++) {
answer[i] = deleteList.get(i);
}
return answer;
}
}