본문 바로가기

공부/예제 풀이

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

아 이거 좀 최적화를 진짜 못시킨 느낌...

첫번째로 각 약관(ABC...)들의 유효기간을 map에 담았다. key는 약관(ABC..) value는 유효기간.

여기서 애먹었던 첫번째 String.split(".") 이게 안먹는다. 정규표현식에서 문제가 있나보다 이걸 String.split("\\.")로 사용하니까 됐다. 

두번째 처음 로직을 짤 때 12월일 때 예외처리를 좀 이상하게 했다. 그래서 테스트 케이스에서 실패가 떴음.

처음 어떻게했냐면 month값에 약관에 해당하는 값을 map에서 받아서 더해준다. 이때 %12를 해서 값을 얻어오려고 했음.

그런데 생각해보니 12월일 때 12로 나누면 나머지가 0임. 잉? 뭐야 안되네? 하고 그냥 냅다 %13을 갈김; (부끄러운 수준;;)

-> 근데 테스트 케이스에서는 약관이 12개월 이하라서 문제가 안생겼는데 제출할 때 자꾸 실패가 뜸.

이거 나중에 다시 생각해보니 약관이 24개월 36개월일 때 문제가 생김

그래서 다시 12로 나누었을때 나머지가 0이면 month는 12로 다시 초기화를 해주는 식

마찬가지로 year에는 12로 나누었을 때의 몫을 넣어줬는데 month가 12일 때 몫이 1임. 따라서 month가 12일 때 예외처리만 해주면 끝!(year를 더해줄 때 -1만큼 더해주면 됨)

 

풀이

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.*;

class Solution {
    public List<Integer> solution(String today, String[] terms, String[] privacies) {
        List<Integer> answers = new ArrayList<>();
        
        // terms map으로 변환
        Map<String, Integer> map = new HashMap<>();
        String key, value;
        String[] splitTerms = new String[2];
        for(String s : terms){
            splitTerms = s.split(" ");
            key = splitTerms[0];
            value = splitTerms[1];
            map.put(key, Integer.parseInt(value));
        }
        
        // map 확인용 출력
        for (Entry<String, Integer> entrySet : map.entrySet()) {
            System.out.println(entrySet.getKey() + " : " + entrySet.getValue());               }
        
        // privacies를 .로 split()해주고 담아줄 그릇들
        int month, year, day;
        String term;
        String[] privSplit = new String[3];
        
        // day는 날짜와 약관을  " "로 스플릿할것. 담아줄 그릇 생성
        String[] daySplit = new String[2];
        
        // 오늘 날짜를 int로 변환하기 위해 
        String[] todaySplit = new String[3];
        todaySplit = today.split("\\.");
        
        // i는 인덱스용, privacyDay는 privacies의 날짜를 int로 치환용,
        // todayInt는 today int 치환용
        int i=1, privacyDay, todayInt;
        for(String s : privacies){
            
            //이거 왜 안됨..? split(".") 이거 안먹힘..
            //year, month, day를 각각 넎어줌
            privSplit = s.split("\\.");
            year = Integer.parseInt(privSplit[0]);
            month = Integer.parseInt(privSplit[1]);
            
            daySplit = privSplit[2].split(" ");
            day = Integer.parseInt(daySplit[0]);
            
            // day에 같이 붙어있는 약관 뗴주기
            term = daySplit[1];
            
            // month가 12일 때 예외처리
            // 12일 때 12로 나누면 몫이 1이 나오고 나머지가 0이 나옴 -> 오류임
            // 12일 때 달은 month는 12로 초기화, year도 몫에서 1만큼 빼서 더해주면 됨
            
            if((month+map.get(term))%12!=0){
                year += (month + map.get(term))/12;   
            }else if ((month + map.get(term))%12 ==0){
                year += (month + map.get(term))/12 -1; 
            }
            
            // 위와 마찬가지로 month도 12월일 때 예외처리를 해줌
            month += map.get(term);
            if(month>12){
                month%=12;
                if(month%12==0) month = 12;
            }
            
            // String을 Int로 변환
            privacyDay = year*10000 + month*100 +day;
            todayInt = Integer.parseInt(todaySplit[0])*10000
                + Integer.parseInt(todaySplit[1])*100
                + Integer.parseInt(todaySplit[2]);
            
            System.out.println("privacyDat is " + privacyDay);
            System.out.println("todayInt is " + todayInt);
            
            //int기 때문에 직접 연산이 가능
            if(todayInt >=privacyDay){
                System.out.println("i is " + i+"추가 완료");
                answers.add(i);
            } 
            i++;
        }
        
        return answers;
    }
}