2023 KAKAO BLIND RECRUITMENT Lv1. 개인정보 수집 유효기간
https://school.programmers.co.kr/learn/courses/30/lessons/150370
수집된 개인정보 중 파기해야 할 정보의 번호를 구해야 한다.
개인정보의 수집 일로부터 기간이 지난 정보는 파기한다.
- String today : 오늘 날짜 (yyyy.MM.dd)
- String[] terms : 약관 정보(종류, 기간)
- String[] privacies : 수집한 개인정보(수집 일, 약관 종류)
- 약관 정보를 Map으로 관리한다.
- 개인정보 수집 일로부터 특정 보관 기간이 지난 날짜를 계산한다.
- 기간이 지난 개인정보 번호를 저장 및 반환한다.
단순히 노가다를 하면 풀 수 있는 문제였다. 하지만 검색을 통해 좀 더 효율적으로 계산할 수 있는 방법을 찾았다. 년(year) 수와 월(month) 수를 일(day) 수로 치환하는 것이다. (한 달은 28이라고 고정되어 있으므로)
처음에 today.split(".")을 통해 년,월,일을 구해내려 했는데 split이 안됐다🤔 찾아보니 today.split("\\.")으로 분리해야 하더라! 그 이유는 split은 정규식을 받는데 정규식에서 마침표(.)는 임의의 문자를 의미하기 때문! (https://hianna.tistory.com/618)
import java.util.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
int day = getDay(today); // 금일 기준 일 수
Map<String, Integer> map = new HashMap<>();
for (String term : terms) { // 약관 정보 map으로 관리
String[] arr = term.split(" ");
map.put(arr[0], Integer.valueOf(arr[1]));
}
ArrayList<Integer> al = new ArrayList<>();
for (int i = 0; i < privacies.length; i++) {
String privacy = privacies[i];
String[] arr = privacy.split(" ");
// 기간 지나면 파기
if (day >= getDay(arr[0]) + map.get(arr[1]) * 28) {
al.add(i + 1); // 0부터 시작하므로
}
}
int[] answer = new int[al.size()];
for (int i = 0; i < al.size(); i++) {
answer[i] = al.get(i);
}
return answer;
}
private int getDay(String today) { // 일수 구하기
String[] arr = today.split("\\.");
int y = Integer.valueOf(arr[0]);
int m = Integer.valueOf(arr[1]);
int d = Integer.valueOf(arr[2]);
return (y * 12 * 28) + (m * 28) + d;
}
}
- split과 마침표(.)의 관계에 대해 새롭게 배웠다.
- 문제 풀이 중 가독성을 위해서라도 private method로 분리하는 방식을 습관화 하자!