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

mul·2023년 2월 23일
0

알고리즘

목록 보기
27/65
post-custom-banner

🔒 문제

프로그래머스 Lv.1 2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간

🔑 해결

오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어질 때, 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return하는 solution함수를 작성하는 문제이다.

주어진 약관과 날짜를 split으로 조각내어 유효기간 종료날짜를 계산하고, 오늘 날짜와 비교해 파기해야 할 개인정보인지 판단한다. 주어진 문자열을 조각내는 것은 어렵지 않지만, 유효기간 종료날짜를 계산할 때 처리를 잘 해주어야 한다. (ex. 예상 종료날짜가 2021년 0월 14일, 2022년 7월 0일)

  1. 오늘 날짜를 split을 사용해 잘라(2023.02.23 --split--> [2023],[02],[23]) today_ymd 배열에 저장
  2. terms의 length만큼 for문을 돌려 약관(t_term)과 유효기간(t_month)를 분리
  3. privacies의 length만큼 for문을 돌려 수집된 날짜(pdate_pterm[0])와 약관종류(pdate_pterm[1])을 분리
  4. terms의 length만큼 for문을 돌려 privacies[i]의 약관(pdate_pterm[1])과 같은 약관을 t_term 배열에서 찾는다
  5. destory_date(수집된 날짜, 유효기간) 함수로 유효기간 종료날짜를 계산
    5-1. split을 사용해 수집된 날짜(date)를 분리하고 Integer로 형변환하여 각각 yy,mm,dd에 저장
    5-2. 달로 표현된 유효기간에 28을 곱해 일수로 변경하고 dd에 더하기
    5-3. 모든 달이 28일까지 이므로 dd가 28보다 크다면, dd를 28로 나눈 몫을 mm에 더하고, dd를 28로 나눈 나머지를 dd에 저장
    5-4. dd를 28로 나눈 나머지가 0이라면, dd에 다시 28을 저장하고, mm--
    5-5. 1년은 12월까지 이므로 mm이 12보다 크다면, mm을 12로 나눈 몫을 yy에 더하고, mm을 12로 나눈 나머지를 mm에 저장
    5-6. mm을 12로 나눈 나머지가 0이라면, mm에 다시 12를 저장하고, yy--
    5-7. 계산된 yy,mm,dd를 d_date 배열에 담아 return
  6. destory_date로 계산한 종료일자 ddate 배열과 오늘날짜 today_ymd를 check_destory메서드를 통해 비교
    6-1. today배열에 저장된 값을 형변환하여 각각 ty, tm, td에 저장
    6-2. 파기해야 할 날짜의 연도(date[0])와 오늘 날짜의 연도(ty)를 비교하여 파기해야할 날짜가 오늘 이전이면 return true
    6-3. 파기해야 할 날짜와 오늘 날짜의 연도가 같다면(date[0] == ty) 월을 비교하여 오늘 이전이면(date[1] < tm) return true
    6-4. 파기해야 할 날짜와 오늘 날짜의 달이 같다면(date[1] == tm) 일을 비교하여(date[2] < td) return true
  7. check_destory에 반환된 값이 true라면 파기해야할 개인정보라 판단하고 list에 i+1를 add
  8. answer 배열을 list의 size 크기만큼 생성하여 for문을 돌려 list에 저장된 값을 저장한다.

🔓 코드

import java.util.ArrayList;
class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        ArrayList<Integer> list = new ArrayList<>();
        
        String[] today_ymd = today.split("\\.");
        
        String[] t_term = new String[terms.length];
        int[] t_month = new int[terms.length];
        for (int i = 0; i < terms.length; i++) {
        	String[] str = terms[i].split(" ");
        	t_term[i] = str[0]; // 약관 종류
        	t_month[i] = Integer.parseInt(str[1]); // 유효기간
        }
        
        for (int i = 0; i < privacies.length; i++) {
        	// pdate_ptrem[0] = 수집된 날짜, pdate_pterm[1] = 약관 종류
			String[] pdate_pterm = privacies[i].split(" ");
			
			for (int j = 0; j < terms.length; j++) {
				if (pdate_pterm[1].equals(t_term[j])) { // 수집된 개인정보의 약관 종류를 terms에서 찾기
					int[] ddate = destroy_date(pdate_pterm[0], t_month[j]); // 파기해야 할 날짜
					
					if (check_destory(ddate, today_ymd)) { // 파기해야 할 개인정보라면
						list.add(i + 1);
					}
				}
			}
		}
        
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
			answer[i] = list.get(i);
		}
        
        return answer;
    }
    private boolean check_destory(int[] date, String[] today) { // 파기해야할 날짜, 오늘 날짜
    	int ty = Integer.parseInt(today[0]);
    	int tm = Integer.parseInt(today[1]);
    	int td = Integer.parseInt(today[2]);
    	
    	if (date[0] < ty) {
    		return true;
    	} else if (date[0] == ty) {
    		if (date[1] < tm) {
    			return true;
    		} else if (date[1] == tm && date[2] < td) {
    			return true;
    		}
    	}
    	
    	
    	return false;
    }
    
    private int[] destroy_date(String date, int month) { // 수집된 날짜, 유효기간
    	int[] d_date = new int[3];
    	
    	String[] str = date.split("\\.");
    	int yy = Integer.parseInt(str[0]);
    	int mm = Integer.parseInt(str[1]);
    	int dd = Integer.parseInt(str[2]);
    	
    	dd += (month * 28) - 1;
    	if (dd > 28) {
    		mm += (dd / 28);
    		dd = dd % 28;
    	}
    	if (dd == 0) {
    		dd = 28;
    		mm--;
    	}
    	
    	if (mm > 12) {
    		yy += (mm / 12);
    		mm = mm % 12;
    	}
    	if (mm == 0) {
    		mm = 12;
    		yy--;
    	}
    	
    	d_date[0] = yy;
    	d_date[1] = mm;
    	d_date[2] = dd;
    	
    	return d_date;
    }
}
post-custom-banner

0개의 댓글