[Programmers] 개인정보 수집 유효기간
2023. 8. 2. 15:56ㆍComputer Sciences/Problem Solve
https://school.programmers.co.kr/learn/courses/30/lessons/150370
문제 설명
문제 이해 자체는 어렵지 않으나 날짜에 대한 처리를 잘 해야 하는 문제이다. 약관 종류와 약관 별 유효기간, 수집한 개인 정보의 수집 일자, 약관 종류, 오늘 날짜가 주어진다. 개인정보 수집 일자와 유효 기간을 더한 값이 오늘보다 더 긴 경우는 아직 유효기간이 지나지 않았으므로 파기하지 않는다. 대신 더 짧은 경우 유효 기간이 지났으므로 파기해야 한다. 이때 파기해야하는 개인정보 번호를 오름차순으로 반환해야 한다.
코드 1 - 스스로 푼 코드
처음에는 테스트케이스의 1번, 17번이 계속 통과되지 않아 질문을 보니 12월에 대한 처리가 잘못 되었음을 알았다. 이를 해결하는데 시간을 조금 썼다.
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> termsMap = new HashMap<>();
for (String term : terms) {
String[] termDetails = term.split(" ");
termsMap.put(termDetails[0], Integer.valueOf(termDetails[1]));
}
int index = 0;
for (String privacy : privacies) {
index++;
String[] privacyDetails = privacy.split(" ");
String collectDate = privacyDetails[0];
String[] dateDetails = collectDate.split("\\.");
int year = Integer.valueOf(dateDetails[0]);
int month = Integer.valueOf(dateDetails[1]);
int day = Integer.valueOf(dateDetails[2]);
String kindOfTerm = privacyDetails[1];
int validTerm = termsMap.get(kindOfTerm);
month += validTerm;
if (month >= 13) {
if (month % 12 == 0) {
year = year + (month / 12) - 1;
month = 12;
} else {
year = year + (month / 12);
month = month - 12 * (month / 12);
}
}
String[] todayDetails = today.split("\\.");
int todayYear = Integer.valueOf(todayDetails[0]);
int todayMonth = Integer.valueOf(todayDetails[1]);
int todayDay = Integer.valueOf(todayDetails[2]);
if (todayYear < year) {
continue;
} else if (todayYear == year) {
if (todayMonth < month) {
continue;
} else if (todayMonth == month) {
if (todayDay < day) {
continue;
}
}
}
answer.add(index);
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
문제를 풀긴 했으나 후련하지 않아 다른 사람의 풀이를 보았는데 날짜 처리를 모두 day로 변환하여 간단히 해결한 것을 보았다. 이를 적용한 코드는 다음과 같다.
코드 2 - 날짜를 day로 변환하여 처리
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
private static final int DAY_OF_MONTH = 28;
public int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> termsMap = new HashMap<>();
int todayDay = getDay(today);
for (String term : terms) {
String[] termDetails = term.split(" ");
String kindOfTerm = termDetails[0];
Integer period = Integer.valueOf(termDetails[1]);
termsMap.put(kindOfTerm, period);
}
int index = 0;
for (String privacy : privacies) {
index++;
String[] privacyDetails = privacy.split(" ");
String collectDate = privacyDetails[0];
String kindOfTerm = privacyDetails[1];
int expireDay = getDay(collectDate) + (termsMap.get(kindOfTerm) * DAY_OF_MONTH);
if (isExpire(expireDay, todayDay)) {
answer.add(index);
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
private boolean isExpire(int target, int today) {
return target <= today;
}
private int getDay(String date) {
String[] dateDetails = date.split("\\.");
int year = Integer.parseInt(dateDetails[0]);
int month = Integer.parseInt(dateDetails[1]);
int day = Integer.parseInt(dateDetails[2]);
return (year * 12 * DAY_OF_MONTH) + (month * DAY_OF_MONTH) + day;
}
}
'Computer Sciences > Problem Solve' 카테고리의 다른 글
[Programmers] 테이블 해시 함수 (0) | 2023.08.03 |
---|---|
[Programmers] 성격 유형 검사하기 (0) | 2023.08.03 |
[Programmers] 공원 산책 (0) | 2023.08.02 |
[Baekjoon] 2193번: 이친수 (0) | 2023.05.20 |
[Baekjoon] 9657번: 돌 게임 3 (0) | 2023.05.12 |