🎨 문제
📘 풀이
파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 반환하는 solution 함수를 만들어야 합니다. 오해의 소지가 없도록 모든 달이 28일입니다. 개인정보가 파기일을 지났는지만 확인하면 되므로 년, 월, 일을 일로 바꾸어 계산할 것입니다.
입력
today: 오늘 날짜. "YYYY.MM.DD" 문자열 형태
terms: 약관 종류와 유효기간이 띄어쓰기로 구분된 문자열
privacies: 개인정보 수집 일자, 약관 종류가 띄어쓰기로 구분된 문자열
알고리즘
간단한 구현 문제입니다. 날짜라는 것에 겁먹지 않는다면 쉽게 구현할 수 있습니다.
1. 약관 종류에 맞게 개인정보 파기 일자를 계산한다.
2. 오늘 날짜와 비교해 파기일이 지났다면 해당 개인정보 번호를 정답 리스트에 추가한다.
3. 정답 리스트를 오름차순으로 정렬한다.
약관 종류와 유효기간은 HashMap을 사용하여 저장하여 약관 종류를 Key로 빠른 탐색이 가능하도록 하였습니다.
Map<String, Integer> termMap = new HashMap<>();
for (String term : terms) {
String[] t = term.split(" ");
termMap.put(t[0], Integer.valueOf(t[1]));
}
topDown으로 가장 바깥의 로직을 먼저 설계했습니다. 파기일자가 지났다면 정답 배열에 개인정보 번호를 추가합니다.
List<Integer> answer = new LinkedList<>();
for (int i = 0; i < privacies.length; i++) {
String privacy = privacies[i];
if (isFire(privacy, termMap, today)) { // 다음은 isFire() 구현
answer.add(i + 1);
}
}
개인정보, 약관 종류, 오늘 날짜로 개인정보가 파기되어야 하는지 알 수 있습니다.
boolean isFire(String privacy, Map<String, Integer> term, String today)
우선 개인정보에서 날짜와 약관 종류를 분리해야 합니다.
String[] split = privacy.split(" ");
String date = split[0];
String type = split[1];
그 후 수집 날짜를 일로 변환합니다.
private int getDays(String date) {
String[] a = date.split("\\.");
int year = Integer.parseInt(a[0]); // year는 2000부터 시작이니 2000을 빼주면 편하다.
int month = Integer.parseInt(a[1]);
int day = Integer.parseInt(a[2]);
return (year * YEAR * DAY) + (month * DAY) + day;
}
💡 상수는 미리 전역에 선언해 둡니다.
수집 날짜를 통해 파기 날짜도 계산합니다.
private int getFireDays(int days, String type, Map<String, Integer> term) {
int expirationDays = term.get(type) * DAY;
return days + expirationDays;
}
isFire() 함수는 오늘 날짜와 파기 날짜를 비교해 파기 날짜가 작거나 같으면 true를 반환합니다.
private boolean isFire(String privacy, Map<String, Integer> term, String today) {
String[] split = privacy.split(" ");
String date = split[0];
String type = split[1];
int days = getDays(date);
int fireDays = getFireDays(days, type, term);
return fireDays <= getDays(today);
}
📗 코드
import java.util.*;
public class Solution {
private static final int YEAR = 12;
private static final int DAY = 28;
public int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new LinkedList<>();
Map<String, Integer> termMap = new HashMap<>();
for (String term : terms) {
String[] t = term.split(" ");
termMap.put(t[0], Integer.valueOf(t[1]));
}
for (int i = 0; i < privacies.length; i++) {
String privacy = privacies[i];
if (isFire(privacy, termMap, today)) {
answer.add(i + 1);
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
private boolean isFire(String privacy, Map<String, Integer> term, String today) {
String[] split = privacy.split(" ");
String date = split[0];
String type = split[1];
int days = getDays(date);
int fireDays = getFireDays(days, type, term);
return fireDays <= getDays(today);
}
private int getDays(String date) {
String[] a = date.split("\\.");
int year = Integer.parseInt(a[0]);
int month = Integer.parseInt(a[1]);
int day = Integer.parseInt(a[2]);
return (year * YEAR * DAY) + (month * DAY) + day;
}
private int getFireDays(int days, String type, Map<String, Integer> term) {
int expirationDays = term.get(type) * DAY;
return days + expirationDays;
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 이모티콘 할인 행사 - JAVA (2) | 2023.03.10 |
---|---|
[프로그래머스] 택배 배달과 수거하기 - JAVA (0) | 2023.03.10 |
[BOJ] 앱 - 7579 (0) | 2022.12.08 |
[BOJ] Dance Dance Revolution - 2342 (2) | 2022.12.07 |
[프로그래머스] 두 큐 합 같게 만들기 - JAVA (0) | 2022.09.10 |