문제
예를 들어, A라는 약관의 유효기간이 12 달이고,021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면
해당 개인정보는 2022년 1월 4일까지 보관 가능하며
2022년 1월 5일부터 파기해야 할 개인정보입니다.
today : 오늘 날짜를 의미하는 문자열
terms : 약관의 유효기간을 담은 1차원 문자열 배열
privacies : 수집된 개인정보의 정보를 담은 1차원
>> privacies[i] = "yyyy.MM.dd 약관"
이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아
return 하도록 solution 함수를 완성해 주세요.
입출력 예
풀이
날짜를 비교하기 위해 Date 형식을 사용하였다.
문제 통과 후, 다른 사람의 풀이를 보니 날짜 형식이 아닌 숫자로 재해석(?) 하여 풀었다....
그 방식은 내일 다시 풀어보는걸로...!
1. 변수
dateFormat : 날짜 형식 지정
toDate : 주어진 오늘 날짜를 Date 형식으로 변환
resultList : 결과 번호 저장할 변수
termMap : 각각의 약관 별 유효기간 저장
2. 각각의 약관 별 유효기간 저장
Key : 약관 이름
Value : 약관 기간
3. 유효기간 확인
getDate 함수를 통해서 각각의 유효기간을 계산하여 date 변수에 저장한다.
date 값보다 오늘 날짜가 더 과거면 resultList 변수에 해당 index + 1 값을 저장한다.
4. getDate 함수
[ 매개변수 & 변수 ]
strDate : 주어진 개인정보 수집 일자
term : 약관에 따른 유효기간
time : string 형태의 strDate을 년, 월, 일별로 나누어 각각 저장
str : 계산 후의 yyy.MM.dd 의 값 저장할 변수
[ 날짜 계산 ]
월에 따른 년도 변화
일자에 따른 달 변화 설정
[ 날짜 형태 설정 및 반환 ]
time에 저장되어 있는 년, 월, 일을 가지고 String 변수에 yyyy.MM.dd 형식으로 저장
String 변수를 Date 형식으로 변경하여 반환
>> 호출된 함수에서 날짜 비교 시, 사용하기 쉽게..!
5. 반환
반환 값이 int[] 형태로 지정되어 있다.
따라서 결과값을 가지고 있는 resultList 변수을 int[] 형태로 변환 후, 반환한다.
코드
import java.text.*;
import java.util.*;
public static Date getDate(String strDate, int term) throws ParseException {
int[] time = new int[strDate.split("\\.").length]; // yyyy, MM, dd
String str = "";
for (int i = 0; i < time.length; i++) {
time[i] = Integer.parseInt(strDate.split("\\.")[i]);
}
// 달(month)가 1년을 넘은 경우
time[1] += term;
if (time[1] > 12) {
time[0]++;
time[1] -= 12;
}
if (time[2] == 1) {
time[2] = 28;
time[1]--;
if (time[1] == 0)
time[0]--;
} else
time[2]--;
for (int i = 0; i < time.length; i++) {
str += time[i] + "";
if (i != 2)
str += ".";
}
return new Date(new SimpleDateFormat("yyyy.MM.dd").parse(str).getTime());
}
public static int[] solution7(String today, String[] terms, String[] privacies) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd");
Date toDate = new Date(dateFormat.parse(today).getTime());
ArrayList<Integer> resultList = new ArrayList<>();
HashMap<String, Integer> termsMap = new HashMap<>();
// 약관 별 유효기간 저장
for (String t : terms) {
termsMap.put(t.split(" ")[0], Integer.parseInt(t.split(" ")[1]));
}
for (int i = 0; i < privacies.length; i++) {
Date date = getDate(privacies[i].split(" ")[0], termsMap.get(privacies[i].split(" ")[1]));
// 유효기간 지남
if (date.before(toDate)) {
resultList.add(i + 1);
System.out.print(i + " : ");
System.out.print(privacies[i].split(" ")[0] + " ");
System.out.println(privacies[i].split(" ")[1]);
}
}
int[] answer = new int[resultList.size()];
for (int i = 0; i < resultList.size(); i++) {
answer[i] = resultList.get(i);
}
return answer;
}
프로그래머스 문제
https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr