[ 다먹살 ]/- Coding

[프로그래머스] 레벨1 개인정보 수집 유효기간

엉망으로살기 2023. 2. 3. 13:55
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/150370?language=java 

 

프로그래머스

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

programmers.co.kr

 

사실 이 문제 같은 경우에는 설명과 풀이코드는 길지만 그 길이에 비해 난이도가 높다고 볼 수는 없다. 입출력 데이터에 대한 전처리나 특정 케이스를 처리하는 데에 있어 필요한 계산부분이 많아 길이가 길었을 뿐, 문제를 찬찬히 따라가다 보면 그렇게 어렵지 않은 풀이를 구할 수 있다고 생각한다.

주의해야 할 것은, 유효기간은 개인정보 수집일자에 약관별 유효기간을 더한 후 반드시 -1일을 해줘야한다는 것이며 내가 생각했을 때 특이 케이스는 아래의 3가지뿐이다. 

1. 유효기간 산정 시 월이 12를 넘어가는 경우

2. 유효기간 계산 시 -1을 했을 때 날짜가 0이 되는 경우

3. 위의 1번에 의해 날짜뿐만 아니라 월도 0이 되는 경우

 

각각의 케이스별로 나는 day, month, year 변수를 통해 따로 계산하는 방식을 선택했다. 더불어 Date나 Calendar 같은 내부 API 사용법에 대해 익혀놓는다면 이와 유사한 문제를 해결하는 데 있어 굉장히 유용할 것이라 생각하기 떄문에 꼭 시간을 내서 활용방법을 익혀놔야 할 것 같다.

 


문제 및 제한사항


입출력 및 예제


코드

import java.util.ArrayList;

class Solution
{
    public Object[] solution(String today, String[] terms, String[] privacies)
    {
        ArrayList<Integer> answer = new ArrayList<Integer>();
        String[][] term = new String[terms.length][2];
        
        String[] t_temp = today.split("\\.");
        int t_year = Integer.parseInt(t_temp[0]);
        int t_month = Integer.parseInt(t_temp[1]);
        int t_day = Integer.parseInt(t_temp[2]);
        
        for(int i=0; i<terms.length; i++)
        {
            String[] temp = terms[i].split(" ");
            
            for(int j=0; j<2; j++)
            {
                term[i][j] = temp[j];
            }
        }
        for(int i=0; i<privacies.length; i++)
        {
            String[] temp = privacies[i].split(" ");
            String[] start = temp[0].split("\\.");
            int year = Integer.parseInt(start[0]);
            int month = Integer.parseInt(start[1]);
            int day = Integer.parseInt(start[2]);
            
            for(int j=0; j<terms.length; j++)
            {
                if(temp[1].equals(term[j][0]))
                {
                    month += Integer.parseInt(term[j][1]);
                    day--;
                    
                    if(month>12)
                    {
                        year += month/12;
                        month -= (12*(month/12));
                    }
                    if(day==0)
                    {
                        day = 28;
                        month--;
                    }
                    if(month==0)
                    {
                        month = 12;
                        year--;
                    }
                    
                    break;
                }
            }
            
            if(t_year>year)
            {
                answer.add(i+1);
            }
            else if(t_year==year)
            {
                if(t_month>month)
                {
                    answer.add(i+1);
                }
                else if(t_month==month)
                {
                    if(t_day>day)
                    {
                        answer.add(i+1);
                    }
                }
            }
        }
        
        return answer.toArray();
    }
}

 

반응형