본문 바로가기
PS

[자바] 프로그래머스 - 개인정보 수집 유효기간 (2023 카카오 블라인드) 풀이

by 제이._ 2023. 1. 8.

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2023년도 카카오 블라인드 채용 코딩테스트 문제입니다.

프로그래머스 기준 현재 570명 풀이 완료 및 27%의 정답률을 기록하고 있습니다.

아마도 나온지 얼마 안 돼서 정답률은 낮아보이지만, 실제로는 어렵지 않은 문제입니다.

 


문제 풀이 및 접근 방법

 

고객의 개인정보 수집 일자와 약관의 종류에 따라 고객의 개인정보 수집 일자를 구하고,

그걸 오늘 날짜와 비교해서 파기해야하는 정보인지 아닌지 찾는 문제입니다.

카카오에서 평소 출제하는 문제보다는 쉬운 난이도의 구현 문제입니다.

저는 이 문제를 풀기 위해서 다음과 같이 접근했습니다.

  1. 문제에서 주어진 오늘 날짜를 일자로 치환한다.
  2. 주어지는 약관의 종류와 기간을 HashMap에 저장한다.
  3. 주어지는 privacies를 하나하나 일자로 변경한 후 오늘 날짜의 일자와 비교해서 작다면 정답처리를 한다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Solution {
    public static List<Integer> solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();

        // 0. today의 날을 일자로 환산
        String[] todayDateInfo = today.split("\\.");
        int dateCountOfToday = getDate(todayDateInfo);

        // 1. 약관을 map에 저장한다.
        HashMap<String, Integer> typeOfTerms = new HashMap<>();
        for (String term : terms) {
            typeOfTerms.put(term.split(" ")[0], Integer.parseInt(term.split(" ")[1]));
        }

        // 2. 날을 모두 더해서 today와 비교한다.
        for (int i = 0; i < privacies.length; i++) {
            String[] privacy = privacies[i].split(" ");
            String[] privacyDateInfo = privacy[0].split("\\.");
            int termMonthOfPrivacy = typeOfTerms.get(privacy[1]);
            int dateCountOfPrivacy = getDate(privacyDateInfo);
            if (isDestroyed(dateCountOfToday, dateCountOfPrivacy, termMonthOfPrivacy)) {
                answer.add(i + 1);
            }
        }
        return answer;
    }

    private static boolean isDestroyed(int dateCountOfToday, int dateCountOfPrivacy, int termMonthOfPrivacy) {
        if (dateCountOfToday >= getDateWithTerm(dateCountOfPrivacy, termMonthOfPrivacy)) {
            return true;
        }
        return false;
    }

    private static int getDate(String[] dateInfo) {
        int dateOfYear = Integer.parseInt(dateInfo[0]) * 12 * 28;
        int dateOfMonth = Integer.parseInt(dateInfo[1]) * 28;
        int dateOfDay = Integer.parseInt(dateInfo[2]);
        return dateOfYear + dateOfMonth + dateOfDay;
    }

    private static int getDateWithTerm(int dateCountOfPrivacy, int termMonthOfPrivacy) {
        return dateCountOfPrivacy + termMonthOfPrivacy * 28;
    }
}