1. 문제
고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
모든 달은 28일까지 있다고 가정합니다.
2. 풀이
1. 약관 유효기간 terms을 key는 약관이름, value는 약관 유효기간(달 수*28)으로 map을 이용해 저장한다.
2. today를 날짜 수로 변환해서 days에 저장한다.
3. 답을 저장하기위해 list를 사용한다. privacies에 있는 string을 하나씩 꺼내서 날짜수로 변환한다. (pdays)
4. pdays와 days를 비교해서 만약 해당하는 약관 유효기간보다 더 크거나 같다면 파기해야하는 개인정보이므로 list에 더한다.
5. list를 int 배열로 만든다.
* 2,3에 사용한 날짜수 변환 식은 다음과 같다. 메서드로 만들어서 사용했다. (연도-1)*12달*28일 + (월-1)*28일 + (일)
import java.util.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
StringTokenizer st;
//term
Map<String, Integer> term = new HashMap<>();
for(int i=0;i<terms.length;i++){
st = new StringTokenizer(terms[i]);
term.put(st.nextToken(), Integer.parseInt(st.nextToken())*28);
}
//today
int days = getDays(today);
//privacy
List<Integer> list = new ArrayList<>();
int idx = 1;
for(String privacy:privacies){
st = new StringTokenizer(privacy," ");
int pdays = getDays(st.nextToken());
if(days-pdays >= term.get(st.nextToken())){
list.add(idx);
}
idx++;
}
//list -> array
int[] answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i] = list.get(i);
}
return answer;
}
public int getDays(String date){
StringTokenizer st = new StringTokenizer(date,".");
int year = Integer.parseInt(st.nextToken());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
int days = (year-1)*12*28 + (month-1)*28 + day;
return days;
}
}
3. 결과
'코딩테스트 > PROGRAMMERS' 카테고리의 다른 글
[Programmers] 최소 직사각형 - JAVA (0) | 2023.05.09 |
---|---|
[PG] 구명보트 - JAVA (0) | 2023.02.06 |
[PG] 비밀지도 - JAVA (0) | 2022.10.09 |
[PG] 오픈채팅방 - JAVA (0) | 2022.10.02 |
[PG] 뉴스 클러스터링 - JAVA (1) | 2022.09.24 |
댓글