개인정보 수집 유효기간(2023 KAKAO BLIND RECRUITMENT)

권 해·2023년 2월 11일

Algorithm

목록 보기
10/49

문제

코드

import java.util.*;
class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        Map<String,Integer> term=new HashMap<>();
        ArrayList<Privacy> privacy=new ArrayList<>();
        ArrayList<Integer> checkResult=new ArrayList<>();
        for(String s:terms) 
            term.put(s.split(" ")[0],Integer.parseInt(s.split(" ")[1]));
        
        
        for(String s:privacies){
            String date=s.split(" ")[0];
            String type=s.split(" ")[1];
            privacy.add(new Privacy(date.split("[.]")[0],date.split("[.]")[1],date.split("[.]")[2],term.get(type)));
        }
        
        for(int i=0;i<privacy.size();i++){
            if(privacy.get(i).check(today)!=true)
                checkResult.add(i+1);
        }
        
        int[] answer=new int[checkResult.size()];
        for(int i=0;i<answer.length;i++)
            answer[i]=checkResult.get(i);

        return answer;
    }
}
class Privacy{
    private int startYear;
    private int startMonth;
    private int startDay;
    private int endYear;
    private int endMonth;
    private int endDay; 
    private int term;
    
    Privacy(String year,String month,String day,int term){
        this.startYear=Integer.parseInt(year);
        this.startMonth=Integer.parseInt(month);
        this.startDay=Integer.parseInt(day);
        this.term=term;
        setEndDate();
    }
    
    public void setEndDate(){
        if(startMonth+term>12){
            endYear=startYear+(startMonth+term)/12;
            endMonth=(startMonth+term)%12;
            endDay=startDay-1;
        }
        else{
            endYear=startYear;
            endMonth=startMonth+term;
            endDay=startDay-1;
        }
        if(endDay==0){
            endMonth-=1;
            endDay=28;
        }
        if(endMonth==0){
            endYear-=1;
            endMonth=12;
        }    
    }
    
    public boolean check(String today){
        int todayYear=Integer.parseInt(today.split("[.]")[0]);
        int todayMonth=Integer.parseInt(today.split("[.]")[1]);
        int todayDay=Integer.parseInt(today.split("[.]")[2]);
        
        if(endYear<todayYear)
            return false;
        else if(endYear>todayYear) 
            return true;
        else{
            if(endMonth<todayMonth)
                return false;
            else if(endMonth>todayMonth)
                return true;
            else{
                if(endDay<todayDay)
                    return false;
                else 
                    return true;
            }
        }
    }
}

풀이

사실 조금 귀찮기는 하지만 크게 복잡한 문제는 아니었다.
날짜가 지나가는 것을 관리해야 하다 보니 12월이 넘어가는 것과 28일을 넘어 가는 부분을 잘 처리해 주는 것이 중요했다.
이번 문제에서는 최대한 가독성이 좋은 코드를 만들기 위해 객체지향적으로 작성하려 노력했다.

(1) 개인정보 약관에 따른 수집 기간을 Map으로 미리 저장해둔다.
(2) privacies 배열에 있는 개인정보들을 Privacy 클래스로 생성하여 클래스 배열에 추가하여 준다. 이때 문자열은 split() 함수를 사용하여 다루어 준다.
(3) Privacy 클래스의 생성자는 개인정보 수집 일자, 개인정보 약관 정보를 인자로 받아서 개인정보 만료 날짜를 자동으로 생성하여 준다.
(4) 오늘 날짜를 매개변수로 넘겨줘서 Privacy 클래스 배열의 항목들의 만료 여부를 확인한다.

결과

날짜 계산이 계속 잘못되어 정확성이 계속 100이 안나와서 살짝 어려움이 있었다. 유효기간이 50개월 100개월 처럼 12개월이 넘을 수도 있다는 사실을 무시하고 만료 날짜 처리를 해버렸다. 그래도 코드는 나름대로 깔끔하게 나온 것 같아 만족스럽다.

출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges

0개의 댓글