[2023 KAKAO BLIND RECRUITMENT] 개인정보 수집 유효기간

최민길(Gale)·2023년 2월 21일
1

알고리즘

목록 보기
41/172

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/150370

[이 문제는 프로그래머스에서 푼 문제입니다.]
이 문제는 문제에서 요구하는 조건을 잘 읽어보고 하나씩 구현해나가면 됩니다. 저같은 경우는 HashMap을 이용하여 terms 배열을 재배치하여 privacies 배열에서 유효 기간을 탐색하여 반복문을 이용하여 탐색했을 때에 비해서 탐색 속도를 O(N)에서 O(1)로 감소시켰습니다. 이어서 날짜 계산 시 split으로 .을 기준으로 자른 후 날짜 계산을 진행했습니다.

제가 난항을 겪은 부분은

  1. . 사용 시 \.로 사용해야 한다
  2. 최종 결과물을 int[] 로 출력하는데 이 때 초기화가 되어 있지 않았다.
  3. 달과 일 수가 바뀔 경우 달과 일 수만 바꿔주는 것이 아니라 각각 연도와 달 수도 같이 수정해주어야 한다.

이 부분만 유의하시면 성공적으로 푸실 수 있습니다.

다음은 코드입니다.

import java.util.*;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        // terms 배열 재배치
        Map<String, Integer> req = new HashMap<>();
        for(int i=0;i<terms.length;i++){
            StringTokenizer st = new StringTokenizer(terms[i]);
            String type = st.nextToken();
            int term = Integer.parseInt(st.nextToken());
            req.put(type,term);
        }
        
        // privacies 배열 탐색
        Queue<Integer> res = new LinkedList<>();
        for(int i=0;i<privacies.length;i++){
            StringTokenizer st = new StringTokenizer(privacies[i]);
            String date = st.nextToken();
            String type = st.nextToken();
            
            int term = req.get(type);
            boolean isAnswer = !isValidPrivacies(today, date, term);
            
            if(isAnswer) res.add(i+1);
        }
        
        int[] answer = new int[res.size()];
        int idx = 0;
        while(!res.isEmpty()){
            int curr = res.poll();
            answer[idx] = curr;
            idx++;
        }
        
        return answer;
    }
    
    static boolean isValidPrivacies(String today, String date, int term){
        // . 기준으로 문자열 자른 배열 생성
        // .을 기준으로 자를 경우 \\. 으로 처리 필요
        String[] todayArr = today.split("\\.");
        String[] dateArr = date.split("\\.");
        
        // 오늘 날짜 추출
        int todayYear = Integer.parseInt(todayArr[0]);
        int todayMonth = Integer.parseInt(todayArr[1]);
        int todayDay = Integer.parseInt(todayArr[2]);

        
        // 비교할 날짜 추출
        int currYear = Integer.parseInt(dateArr[0]);
        int currMonth = Integer.parseInt(dateArr[1]);
        int currDay = Integer.parseInt(dateArr[2]);    
        
        // 연도가 바뀌는 수 : + term/12
        // 달이 바뀌는 수 : + term%12
        // 일이 바뀌는 수 : - 1
        int newYear = currYear + (term/12);
        int newMonth = currMonth + (term%12);
        // 달이 12보다 클 경우 연도를 1 증가
        if(newMonth > 12){
            newYear++;
            newMonth -= 12;
        }
        int newDay = currDay - 1;
        // 일 수가 1보다 작을 경우 달 수 1 감소
        if(newDay==0){
            newMonth--;
            newDay = 28;
        }
        
        // 유효기간 만료 연도가 현재 연도보다 클 경우 아직 유효
        if(todayYear < newYear) return true;
        // 유효기간 만료 연도가 현재 연도보다 작을 경우 만료
        else if(todayYear > newYear) return false;
        // 유효기간 만료 연도가 현재 연도와 같을 경우 달 수 비교
        else{
            // 유효기간 만료 달 수가 현재 달 수보다 클 경우 아직 유효
            if(todayMonth < newMonth) return true;
            // 유효기간 만료 달 수가 현재 달 수보다 작을 경우 만료
            else if(todayMonth > newMonth) return false;
            // 유효기간 만료 달 수가 현재 달 수와 같을 경우 일 수 비교
            else{
                // 유효기간 만료 일 수가 현재 일 수보다 클 경우 아직 유효
                if(todayDay < newDay) return true;
                // 유효기간 만료 일 수가 현재 일 수보다 작을 경우 만료
                else if(todayDay > newDay) return false;
                // 일 수가 현재 일 수와 같다면 유효
                else return true;
            }
        }
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글