모든 달의 일을 28일로 두고 계산한다고 가정하였기 때문에 정수로 바꾸어 크키를 비교하여 폐기여부를 결정하는 알고리즘을 짜서 해결하고자 하였다.

<사전 생각>

정수(Int) 의 범위는 -2^31 ~ 2^31-1 약 (-21억~+21억) 사이 이기 때문에 정수 범위를 초과하여 문제가 발생하는 경우는 없다고 생각하고 

"1971.11.01" 식의 문자열을 분리 하여야 하는데 split() 함수를 사용할 수 도 있겠지만 

해당 Built-in 함수는 시간소모가 크다는 걸 LeetCode 로 충분히 경험 하였기 때문에 가급적 subString() 함수로 해결하고자 하였다.  

 

<최종 코드>

import java.util.Vector;
// split() 함수를 안쓰는 이유는 시간적으로 소모가 크기 때문 가급적 substring()으로 해결
class Solution {
    // "1971.12.01" 형식의 날짜를 day 수로 변환하는 함수
    private int getParseIntDay(String date){
        int day = 0;
        day+=Integer.parseInt(date.substring(0,4))*28*12;
        day+=Integer.parseInt(date.substring(5,7))*28;
        day+=Integer.parseInt(date.substring(8,10));
        return day;
    }
    // 시간 복잡도 O(nm) 공간 복잡도 O(n+m);
    public int[] solution(String today, String[] terms, String[] privacies) {
        // 당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
        int[] answer = {};
        int dDay = getParseIntDay(today); // 마감기한 구하기
        int[] privaciesInt = new int[privacies.length]; // 저장할 제품기간의 공간
        Vector<Integer> v = new Vector<Integer>(); // 폐기해야 할 데이터의 번호들을 효과적을 저장할 자료구조
        // 제품의 유통기한을 day 수로 변환하여 저장
        for(int i=0;i<privaciesInt.length;i++)
            privaciesInt[i] = getParseIntDay(privacies[i].substring(0,10));
        // (브루트 포스) 모든 경우 검사
        for(int i=0;i< privacies.length;i++){
            for(int j=0;j< terms.length;j++) {
                // 만약 제품의 약관 종류가 같다면 해당 약관의 day만큼 추가
                if (privacies[i].charAt(privacies[i].length()-1)==
                        terms[j].charAt(0)){
                    String mouth = terms[j].substring(2,terms[j].length());
                    privaciesInt[i]+=Integer.parseInt(mouth)*28;
                }
            }
        }
        // 폐기해야할 제품 번호 저장
        for(int i=0;i<privaciesInt.length;i++){
            if(dDay>=privaciesInt[i])
                v.add(i+1);
        }

        int ans[] = new int[v.size()];
        for(int i=0;i<ans.length;i++)
            ans[i] = v.get(i);
        answer = ans;

        return answer;
    }
}

<더 생각해봐야 할 점>

다른 분들의 답안을 보면 나와 같이 숫자로 변환하여 처리하지 않고 날짜 형식으로 format 처리 하여 푼 걸 볼 수 있었는데

그런 방향의 풀이도 고안해 보아야 할 것 같다.

 

<링크>

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

+ Recent posts