[프로그래머스] 개인정보 수집 유효기간 (Java)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd");
LocalDate tDate = LocalDate.parse(today, dtf);
int[] termsAll = new int[26];
for(String term: terms){
String[] ts = term.split(" ");
termsAll[ts[0].charAt(0)-'A'] = Integer.parseInt(ts[1]);
}
List<Integer> answer = new ArrayList<>();
for(int i = 0; i < privacies.length; i++){
String[] privacy = privacies[i].split(" ");
LocalDate privacyDate = LocalDate.parse(privacy[0], dtf).plusMonths(termsAll[privacy[1].charAt(0)-'A']).minusDays(1);
if(privacyDate.isBefore(tDate)){
answer.add(i+1);
}
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
접근방법
자바의 DateTimeFormatter을 사용해 날짜를 포맷하였다.
DateTimeFormatter.ofPattern()은 java의 java.time 패키지에서 날짜와 시간을 원하는 형식으로 서식화하거나 파싱하는데 사용되는 메서드이다.
이 메서드를 사용하면 사용자 지정 패턴에 따라 날짜와 시간을 문자열로 표시하거나 문자열을 날짜와 시간 객체로 파싱 할 수 있다.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd");
LocalDate tDate = LocalDate.parse(today, dtf);
이후 날짜 연산을 수행하기 위해 dtf에 지정된 형식으로 파싱하여 해당 날짜를 나타내는 ‘LocalDate’ 객체를 생성한다.
알파벳 문자(A부터 Z까지)를 인덱스로 사용하여 각 문자에 대한 값을 저장하기 위한 용도로 int[] termsAll 배열을 선언해준다.
terms 문자열을 순회하는 for문에서 각 문자열을 공백 기준으로 하여 ts 배열에 저장한다. 이렇게하면 ts[0]에는 약관종류가, ts[1]에는 유효기간이 저장된다.
약관종류는 알파벳으로 1글자이기 때문에, ts0에서 첫번째 문자를 추출하고 이를 ‘A’문자를 빼서 숫자로 변환한다.
이 숫자를 termsAll 배열의 인덱스로 사용해서 해당 알파벳 문자에 대한 값을 ts[1]에 있는 유효기간의 값을 정수로 변환하여 저장한다.
e.g.) “A 6” -> terms[0] = 6
int[] termsAll = new int[26];
for(String term: terms){
String[] ts = term.split(" ");
termsAll[ts[0].charAt(0)-'A'] = Integer.parseInt(ts[1]);
}
다음으로 파기해야 할 개인정보의 번호를 담을 answer라는 이름의 정수 리스트를 생성한다.
privacies 배열의 길이만큼 for문을 반복한다.
privacy 배열에 각 문자열을 공백기준으로 나누어 저장한다.
String.split(“ “); 은 사용하면 공백을 기준으로 하여 문자열을 나누어 배열로 만들어주는 메소드이다.
‘privacy[0]’에는 날짜 부분이, ‘privacy[1]’에는 약관 종류가 저장된다.
privacy[0]을 dtf를 사용하여 LocalDate객체로 파싱한다.
그리고 privacy[1]을 숫자로 변환하여 termsAll 배열에서 해당 알파벳에 해당하는 값(유효기간)을 가져온 후, plusMonths 메서드를 사용하여 해당 월 수를 더한다.
마지막으로 유효기간 전까지만 보관이 가능하기 때문에 minusDays(1)을 호출하여 결과 날짜를 하루 전으로 변경하여 저장한다.
LocalDate 클래스에서 제공하는 isBefore() 메서드는 이 메서드를 호출하는 LocalDate 객체가 매개변수로 전달된 LocalDate 객체보다 이전 날짜인지 체크한다.
위에서 저장한 privacyDate가 tDate보다 이전 날짜라면 파기해야 할 개인정보로 저장한다.
List<Integer> answer = new ArrayList<>();
for(int i = 0; i < privacies.length; i++){
String[] privacy = privacies[i].split(" ");
LocalDate privacyDate = LocalDate.parse(privacy[0], dtf).plusMonths(termsAll[privacy[1].charAt(0)-'A']).minusDays(1);
if(privacyDate.isBefore(tDate)){
answer.add(i+1);
}
}
마지막으로 리스트를 스트림으로 변환한후 mapToInt로 각요소를 정수로 변환하는 매핑 작업을 수행한다.
그 다음 toArray()를 사용하여 스트림의 요소를 배열로 변환한다.
변환된 배열을 반환해준다.