프로그래머스 코딩 테스트 연습 문제 - 개인정보 수집 유효기간 / JAVA 풀이 정리
풀이
고객의 약관 동의 일자와, 약관 종류에 따라 오늘 날짜로 파기해야 할 개인정보 번호들을 구하는 문제입니다.
처음에는 날짜 입력값의 "."을 "-"로 변경하고, LocalDate 타입으로 파싱 해서 LocalDate 클래스의 날짜 연산 메서드를 활용해서 풀어보려고 시도했지만, " 모든 달은 28일까지 있다고 가정합니다." 규칙으로 인해 의도한 대로 결과가 나오지 않아, 오늘 날짜와 보관 가능한 날짜를 일(day)로 변환한 날짜 간 차이가 약관 종류별 유효 기간을 초과하는지 확인하는 방법을 사용했습니다.
public int[] solution(String today, String[] terms, String[] privacies) {
final int DAYS_IN_MONTH = 28;
final int MONTHS_IN_YEAR = 12;
Map<String, Integer> termsMap = new HashMap<>();
List<Integer> result = new ArrayList<>();
String[] todayParts = today.split("\\."); / "\\." - 정규표현식(Regex), "[.]"도 가능
int currentYear = Integer.parseInt(todayParts[0]);
int currentMonth = Integer.parseInt(todayParts[1]);
int currentDay = Integer.parseInt(todayParts[2]);
for (String term : terms) {
String[] splitTerm = term.split(" ");
termsMap.put(splitTerm[0], Integer.parseInt(splitTerm[1]));
}
//
1. 오늘 날짜를 "."을 기준으로 분리해 연도 / 월 / 일로 분리하고, 약관 정보를 Map에 저장한다.
for (int i = 0; i < privacies.length; i++) {
String[] privacyParts = privacies[i].split(" ");
String[] dateParts = privacyParts[0].split("\\.");
int privacyYear = Integer.parseInt(dateParts[0]);
int privacyMonth = Integer.parseInt(dateParts[1]);
int privacyDay = Integer.parseInt(dateParts[2]);
// 오늘 날짜에서 개인정보 수집 날짜를 빼고, 일 단위로 변환
int totalDaysFromPrivacy = (currentYear - privacyYear) * DAYS_IN_MONTH * MONTHS_IN_YEAR
+ (currentMonth - privacyMonth) * DAYS_IN_MONTH
+ (currentDay - privacyDay);
int expirationDays = termsMap.get(privacyParts[1]) * DAYS_IN_MONTH;
if (totalDaysFromPrivacy >= expirationDays) {
result.add(i + 1);
}
}
return result.stream().mapToInt(i -> i).toArray();
2. privacies 배열을 순회하며, totalDaysFromPrivacy와 expirationDays을 계산한다.
( totalDaysFromPrivacy 는 개인 정보를 보관했던 총 기간(일)이라 생각하면, 조금 더 이해가 쉬울 듯?)
3. 계산한 totalDaysFromPrivacy가 expirationDays 보다 크거나 같다면 → 파기 대상, 결과 List에 추가한다.
4. 결과 List를 정수 배열로 변환해 반환한다.
(전체 코드 한 번에 보기)
더보기
public int[] solution(String today, String[] terms, String[] privacies) {
final int DAYS_IN_MONTH = 28;
final int MONTHS_IN_YEAR = 12;
Map<String, Integer> termsMap = new HashMap<>();
List<Integer> result = new ArrayList<>();
String[] todayParts = today.split("\\.");
int currentYear = Integer.parseInt(todayParts[0]);
int currentMonth = Integer.parseInt(todayParts[1]);
int currentDay = Integer.parseInt(todayParts[2]);
for (String term : terms) {
String[] splitTerm = term.split(" ");
termsMap.put(splitTerm[0], Integer.parseInt(splitTerm[1]));
}
for (int i = 0; i < privacies.length; i++) {
String[] privacyParts = privacies[i].split(" ");
String[] dateParts = privacyParts[0].split("\\.");
int privacyYear = Integer.parseInt(dateParts[0]);
int privacyMonth = Integer.parseInt(dateParts[1]);
int privacyDay = Integer.parseInt(dateParts[2]);
int totalDaysFromPrivacy = (currentYear - privacyYear) * DAYS_IN_MONTH * MONTHS_IN_YEAR
+ (currentMonth - privacyMonth) * DAYS_IN_MONTH
+ (currentDay - privacyDay);
int expirationDays = termsMap.get(privacyParts[1]) * DAYS_IN_MONTH;
if (totalDaysFromPrivacy >= expirationDays) {
result.add(i + 1);
}
}
return result.stream().mapToInt(i -> i).toArray();
}
'Today I Learned > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 - JAVA (0) | 2024.01.18 |
---|---|
[프로그래머스] 숫자 짝꿍 - JAVA (0) | 2023.09.25 |
[프로그래머스] 도둑질 - JAVA (0) | 2023.09.24 |
[프로그래머스] 금과 은 운반하기 - JAVA (0) | 2023.09.22 |
[프로그래머스] 문자열 밀기 - JAVA (0) | 2023.09.21 |