프로그래머스 Lv.1 2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간
오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어질 때, 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return하는 solution함수를 작성하는 문제이다.
주어진 약관과 날짜를 split으로 조각내어 유효기간 종료날짜를 계산하고, 오늘 날짜와 비교해 파기해야 할 개인정보인지 판단한다. 주어진 문자열을 조각내는 것은 어렵지 않지만, 유효기간 종료날짜를 계산할 때 처리를 잘 해주어야 한다. (ex. 예상 종료날짜가 2021년 0월 14일, 2022년 7월 0일)
import java.util.ArrayList;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
ArrayList<Integer> list = new ArrayList<>();
String[] today_ymd = today.split("\\.");
String[] t_term = new String[terms.length];
int[] t_month = new int[terms.length];
for (int i = 0; i < terms.length; i++) {
String[] str = terms[i].split(" ");
t_term[i] = str[0]; // 약관 종류
t_month[i] = Integer.parseInt(str[1]); // 유효기간
}
for (int i = 0; i < privacies.length; i++) {
// pdate_ptrem[0] = 수집된 날짜, pdate_pterm[1] = 약관 종류
String[] pdate_pterm = privacies[i].split(" ");
for (int j = 0; j < terms.length; j++) {
if (pdate_pterm[1].equals(t_term[j])) { // 수집된 개인정보의 약관 종류를 terms에서 찾기
int[] ddate = destroy_date(pdate_pterm[0], t_month[j]); // 파기해야 할 날짜
if (check_destory(ddate, today_ymd)) { // 파기해야 할 개인정보라면
list.add(i + 1);
}
}
}
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
private boolean check_destory(int[] date, String[] today) { // 파기해야할 날짜, 오늘 날짜
int ty = Integer.parseInt(today[0]);
int tm = Integer.parseInt(today[1]);
int td = Integer.parseInt(today[2]);
if (date[0] < ty) {
return true;
} else if (date[0] == ty) {
if (date[1] < tm) {
return true;
} else if (date[1] == tm && date[2] < td) {
return true;
}
}
return false;
}
private int[] destroy_date(String date, int month) { // 수집된 날짜, 유효기간
int[] d_date = new int[3];
String[] str = date.split("\\.");
int yy = Integer.parseInt(str[0]);
int mm = Integer.parseInt(str[1]);
int dd = Integer.parseInt(str[2]);
dd += (month * 28) - 1;
if (dd > 28) {
mm += (dd / 28);
dd = dd % 28;
}
if (dd == 0) {
dd = 28;
mm--;
}
if (mm > 12) {
yy += (mm / 12);
mm = mm % 12;
}
if (mm == 0) {
mm = 12;
yy--;
}
d_date[0] = yy;
d_date[1] = mm;
d_date[2] = dd;
return d_date;
}
}