프로그래머스 Level1 개인정보 수집 유효기간 (Java)

한승현·2023년 1월 5일
0

programmers

목록 보기
10/22
  • https://school.programmers.co.kr/learn/courses/30/lessons/150370

  • 문제

    • n개의 개인정보가 주어진다.
    • 각 개인정보당 약관 종류가 다르며, 약관의 종류마다 유효기간이 다르다.
    • 현재 날짜가 주어진다.
    • 한달은 28일로 계산한다.
    • 유효기간이 지나 파기해야 할 개인정보의 번호들을 반환하라
  • 제한사항

    • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
    • 1 ≤ terms의 길이 ≤ 20
      • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
      • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
      • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
    • 1 ≤ privacies의 길이 ≤ 100
      • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
      • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
      • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
      • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
    • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
      • 2000 ≤ YYYY ≤ 2022
      • 1 ≤ MM ≤ 12
      • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
      • 1 ≤ DD ≤ 28
      • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
    • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.
  • 코드

    import java.util.ArrayList;
    import java.util.HashMap;
    
    public class Solution {
        private static int[] addDays(int year,int month, int day,int term) {
            int[] days = new int[3];
            days[0] = year+(month+term)/12;
            days[1] = (month+term)%12;
            days[2] = day;
            if(day == 0) {
                days[1] -=1;
                days[2] = 28;
            }
            if(days[1] == 0) {
                days[0]-=1;
                days[1] = 12;
            }
            return days;
        }
    
        private static boolean isLonnger(int[] A,int[] B) {
            for(int i = 0; i < 3; i++) {
                if(A[i] < B[i]) {
                    return true;
                }else if(A[i] > B[i]) {
                    return false;
                }
            }
            return false;
        }
    
        private static int[] transDayToInt(String day) {
            int[] answer = new int[3];
            String[] days = day.split("[.]");
            for(int i = 0; i < 3; i++) {
                answer[i] = Integer.parseInt(days[i]);
            }
            return answer;
        }
    
        public int[] solution(String today, String[] terms, String[] privacies) {
            HashMap<String,Integer> map = new HashMap<>();
            ArrayList<Integer> answer = new ArrayList<>();
    
            for(int i = 0; i < terms.length; i++) {
                String[] cur = terms[i].split(" ");
                map.put(cur[0], Integer.parseInt(cur[1]));
            }
    
            int[] todays = transDayToInt(today);
    
            for(int i = 0; i < privacies.length; i++) {
                String[] cur = privacies[i].split(" ");
                int[] day = transDayToInt(cur[0]);
                int[] curDay = addDays(day[0],day[1],day[2]-1,map.get(cur[1]));
    
                if(isLonnger(curDay,todays)) {
                    answer.add(i+1);
                }
            }
            return answer.stream().mapToInt(i -> i).toArray();
        }
    
    }
    
  • 풀이

    • 날짜를 계산하는 문제다. 이런 문제들은 한달 당 며칠인지 파악하는 것이 중요하다.(30, 31, 28일 등 다양하기 때문에)
    • 일 -> 월 -> 년 차례대로 덧셈을 하고, 올림을 해서 다시 계산한다.
    • 편의상 AraryList를 사용하고 배열로 변환해 반환했다.
      • AraryList.stream().mapToInt(i -> i).toArray();
      • privacies의 개수만큼 배열을 생성하고, 유효기간이 지난 날들만 체크해서 새롭게 배열을 반환하는 방식으로도 구현이 가능하다.
profile
사람을 만족시켜줄 수 있는 개발자

0개의 댓글