우당탕탕 개발일지

[프로그래머스] 개인정보 수입 유효기간 (Java, Level.1) 본문

코테/프로그래머스

[프로그래머스] 개인정보 수입 유효기간 (Java, Level.1)

ujin302 2024. 7. 9. 18:57
반응형

문제

예를 들어, 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

 

반응형