top of page
검색

[Java] 2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간

  • 작성자 사진: Gunn
    Gunn
  • 2023년 12월 13일
  • 2분 분량

Programmers에 공개된 2023 KAKAO BLIND RECRUITMENT (2023년 신입 공채 1차 온라인 코딩 테스트) 중에서 Lv.1로 설정되어 있는 개인정보 수집 유효기간 문제입니다.


1. 문제 및 조건


문제

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.


입력

오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다.

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.

  • 1 ≤ terms의 길이 ≤ 20

  • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.

  • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.

  • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.

  • 1 ≤ privacies의 길이 ≤ 100

  • privacies[i]i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.

  • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.

  • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.

  • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.

  • todayprivacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.

  • 2000 ≤ YYYY ≤ 2022

  • 1 ≤ MM ≤ 12

  • MM이 한 자릿수인 경우 앞에 0이 붙습니다.

  • 1 ≤ DD ≤ 28

  • DD가 한 자릿수인 경우 앞에 0이 붙습니다.

  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.


출력

파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열로 리턴한다.


입출력 예시

today

terms

privacies

result

"2022.05.19"

["A 6", "B 12", "C 3"]

["2022.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]

[1, 3]

"2020.01.01"

["Z 3", "D 5"]

["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"]

[1, 4, 5]



2. 설명


 문자열 처리에 관한 문제입니다. 날짜 형식은 YYYY.MM.DD 형식으로 모두 일정하고, 모든 달의 일수가 28일로 고정되어 있습니다. 약관에 적혀 있는 달 수를 개인정보를 보관하기 시작한 일수와 합하면 보관 만료일이 나옵니다. 보관 만료일과 오늘 날짜를 비교해 보관 만료일이 지났을 경우 해당 개인정보의 인덱스+1 값을 저장해 리턴하면 문제가 해결됩니다.


3. 해결 방식


일단 결과가 개인정보 보관 순서에 대한 1차원 배열이기 때문에, 개인정보를 오름차순으로 조회하면서 지난 날짜를 결과 배열에 넣으면 되기 때문에 따로 정렬을 할 필요는 없습니다.

Timestamp와 비슷한 방식으로 날짜를 비교하기 편하게 일수로 변환해 비교한 후, 일수가 작으면 리스트에 저장하는 방식으로 문제를 해결했습니다.


문제 설명
문제 설명

  1. terms배열에 있는 값을 이름과 월수로 분리해서 이름을 Key, 월수를 Value로 저장합니다. (termsMap)

  2. privacies배열에 있는 값을 날짜와 terms이름으로 분리합니다.

  3. terms이름을 termsMap에서 조회해 월수를 가져온 후, 날짜의 일수 + 월수의 일수를 계산해 만료일의 일수를 계산합니다.

  4. 오늘 날짜의 일수를 계산합니다.

  5. 오늘 날짜의 일수와 만료일의 일수를 비교해, 오늘 날짜의 일수 ≥ 만료일인 경우 결과 리스트에 저장합니다.

  6. 모든 반복이 종료되었을 경우 최종 리스트의 배열을 반환합니다.


4. 코드

public class Solution1 {
    public static void main(String[] args){
        Solution1 solution = new Solution1();

        String today = "2022.05.19";
        String[] terms = {"A 6", "B 12", "C 3"};
        String[] privacies = {"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"};

        int[] result = solution.solution(today, terms, privacies);

        for(int i : result){
            System.out.print(i+", ");
        }
    }

    public int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> result = new ArrayList<>();
        Map<String, Integer> termsMap = new HashMap<String, Integer>();

        for(int i=0;i<terms.length;i++){
            String name = terms[i].split(" ")[0];
            String month = terms[i].split(" ")[1];

            termsMap.put(name, Integer.parseInt(month));
        }

        for(int i=0;i<privacies.length;i++){
            String date = privacies[i].split(" ")[0];
            String term = privacies[i].split(" ")[1];

            if(getTimestamp(date) + (termsMap.get(term) * 28) <= getTimestamp(today)){
                result.add(i+1);
            }
        }

        int[] answer = new int[result.size()];

        for(int i=0;i<result.size();i++){
            answer[i] = result.get(i);
        }
        
        return answer;
    }

    private int getTimestamp(String date){
        String[] dateSplit = date.split("\\.");

        int year = Integer.parseInt(dateSplit[0]);
        int month = Integer.parseInt(dateSplit[1]);
        int day = Integer.parseInt(dateSplit[2]);

        return (year * 12 * 28) + (month * 28) + day;
    }
}

Comentários


한일커플 vlog

  • Youtube

© 2023 by Ringun vlog all right reserved.

문의

​문의를 보내주셔서 감사합니다.

bottom of page