프로그래머스 - 개인정보 수집 유효기간
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제에 대한 내용과 입출력 #1 결과를 표로 정리했다.
번호 | 약관 종류(기간) | 개인정보 수집 일자 | 수집 종료 일자 | 상태 |
1 | A (6개월) | 2021.05.02 | 2022.05.01 | 파기 |
2 | B (12개월) | 2021.07.01 | 2022.06.28 | 보관 |
3 | C (3개월) | 2022.02.19 | 2022.05.18 | 파기 |
4 | C (3개월) | 2022.02.20 | 2022.05.19 | 보관 |
각 개인정보 수집 일자에 대한 종료 일자를 구하고, 현재 날짜와 비교하여 결과를 반환한다.
문제를 해결하기 위한 작업 순서를 정리해보자.
1. today를 Date 형식으로 변환
today는 날짜 형식으로 구성되어 있는 String 타입이다.
정확한 날짜 비교를 하기 위해 LocalDate 타입으로 변환하려 한다.
문제에서는 시간 정보가 없고 날짜 정보만 주어졌기 때문에 LocalDate를 사용하여 직관적으로 표현하고자 한다.
2. terms 에서 약관 타입과 유효 기간을 분리
A 6 / B 12 / C 3 으로 구성되어 있는 terms 배열을 Map 구조로 변경하려 한다.
그 이유는 privacies 을 보면 약관 타입이 포함되어 있는데,
해당하는 타입을 terms의 key 로 전달했을 때 매핑된 유효 기간을 쉽게 구할 수 있기 때문이다.
3. privacies 의 종료 일자 구하기
privacies에 들어있는 약관 타입을 사용하여 유효 기간을 조회한다.
수집 일자에서 유효 기간을 더했을 때, today와 비교할 수 있는 종료 일자가 반환된다.
이때, 유효기간이 더해진 수집 일자에서 하루를 빼줘야 정확한 종료 일자가 나온다.
4. today 와 종료 일자 비교
today가 종료 일자를 지나면 해당 개인정보는 파기 상태가 된다.
privacies에는 개인정보 번호 없이 순차적으로 나열되어있으므로, 인덱스를 사용하여 결과값을 구해야 한다.
구현
import java.time.LocalDate;
import java.util.*;
class Solution {
public List<Integer> solution(String today, String[] terms, String[] privacies) {
// 1
LocalDate todayDate = convertToDate(today);
// 2
Map<String, Long> termsMap = termsTypeWithPeriod(terms);
// 3
List<Integer> answer = new ArrayList<>();
for (int i = 0; i < privacies.length; i++) {
String[] privacyArr = privacies[i].split(" ");
LocalDate startCollectDate = convertToDate(privacyArr[0]);
Long period = termsMap.get(privacyArr[1]);
LocalDate validityPeriod = startCollectDate.plusMonths(period).minusDays(1L);
// 4
if (validityPeriod.isBefore(todayDate)) {
answer.add(i + 1);
}
}
return answer;
}
private Map<String, Long> termsTypeWithPeriod(String[] terms) {
Map<String, Long> termsMap = new HashMap<>();
for (String term : terms) {
String[] termArr = term.split(" ");
termsMap.put(termArr[0], Long.valueOf(termArr[1]));
}
return termsMap;
}
private LocalDate convertToDate(String date) {
String[] split = date.split("\\.");
return LocalDate.of(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2]));
}
}
'코딩테스트 > 99클럽 4기' 카테고리의 다른 글
99클럽 코테 스터디 33일차 TIL (0) | 2024.11.29 |
---|---|
99클럽 코테 스터디 32일차 TIL (0) | 2024.11.28 |
99클럽 코테 스터디 31일차 TIL (0) | 2024.11.27 |
99클럽 코테 스터디 30일차 TIL (1) | 2024.11.26 |
99클럽 코테 스터디 29일차 TIL (0) | 2024.11.25 |