프로그래머스 개인정보 수집 유효기간: 월 계산의 경계 처리하기
2023 KAKAO BLIND RECRUITMENT 문제 풀이입니다.
날짜를 나누어 비교했습니다
날짜 문자열을 연·월·일로 나누어 직접 비교하거나 한 달이 28일이라는 조건을 이용해 날짜를 일수로 바꿔 비교할 수 있습니다. 저는 첫 번째 방법으로 작성했습니다.
약관 종류별 유효기간을 맵에 저장합니다. 개인정보마다 수집 날짜와 약관 종류를 읽고 수집 월에 약관의 개월 수를 더합니다. 이렇게 구한 날짜부터는 보관할 수 없으므로 오늘이 그 날짜와 같아도 파기 대상입니다.
6월에서 18개월 뒤라면?
6월에 18개월을 더하면 계산 중의 월은 24가 됩니다. 이를 단순히 12로 나눈 나머지로 바꾸면 존재하지 않는 0월이 나옵니다.
그래서 더한 월이 12보다 클 때 두 경우로 나눴습니다. 나머지가 0이면 월을 12로 두고 연도에는 월 / 12 - 1을 더합니다. 나머지가 있으면 연도에 월 / 12를 더하고 월은 나머지로 바꿉니다. 24월은 이 계산으로 다음 해 12월이 됩니다.
checkDay()는 아직 보관할 수 있으면 true를 반환합니다. 연도, 월, 일 순서로 비교하고 만료일 당일을 포함해 기한이 지났다면 false입니다. 호출한 쪽에서는 false가 나온 개인정보의 번호를 1부터 세어 저장합니다.
당시 제출 코드
import java.util.*;
class Solution {
static HashMap<String, Integer> term = new HashMap<>();
public int[] solution(String today, String[] terms, String[] privacies) {
ArrayList<String> parsedToday = new ArrayList<>();
ArrayList<Integer> answer = new ArrayList<>();
StringTokenizer st = new StringTokenizer(today, ".");
for (int i = 0; i < 3; i++){
parsedToday.add(st.nextToken());
}
//임시 출력
// for (String s : parsedToday){
// System.out.println(s);
// }
for(String str : terms){
st = new StringTokenizer(str, " ");
term.put(st.nextToken(), Integer.parseInt(st.nextToken()));
}
for(int i = 0; i < privacies.length; i++){
st = new StringTokenizer(privacies[i], ". ");
ArrayList<String> parsedPriv = new ArrayList<>();
for (int j = 0; j < 4 ; j++){
parsedPriv.add(st.nextToken());
}
if(!checkDay(parsedToday, parsedPriv)){
answer.add(i+1);
}
}
int[] result = new int[answer.size()];
for(int i = 0; i < result.length ; i++){
result[i] = answer.get(i);
}
return result;
}
static boolean checkDay(ArrayList<String> today, ArrayList<String> privDay){
int todayY = Integer.parseInt(today.get(0));
int todayM = Integer.parseInt(today.get(1));
int todayD = Integer.parseInt(today.get(2));
int privY = Integer.parseInt(privDay.get(0));
int privM = Integer.parseInt(privDay.get(1)) + term.get(privDay.get(3));
int privD = Integer.parseInt(privDay.get(2));
if(privM > 12){
if(privM % 12 == 0){
privY += (privM / 12) - 1;
privM = 12;
} else {
privY += (privM / 12);
privM %= 12;
}
}
int[] todayA = {todayY, todayM, todayD};
int[] priv = {privY, privM, privD};
if(todayY > privY) {
return false;
}
if(todayY == privY && todayM > privM) {
return false;
}
if(todayY == privY && todayM == privM && todayD >= privD) {
return false;
}
return true;
}
}