본문 바로가기
알고리즘

자바 - 프로그래머스 / 개인정보 수집 유효기간

by kdozlo 2023. 5. 3.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

LV 1

 

구현 방법

1 ≤ terms의 길이 ≤ 20

1 ≤ privacies의 길이 ≤ 100

런타임 에러 걱정없이 구현 할 수 있다.

문제는 String 형식으로 된 날짜 형식을 어떤 식으로 바꿔서 날짜 비교를 할지 였다. 처음에는 일일히 년,월,일을 StringTokenizer를 이용해서 나누고, 이걸 int 형식으로 바꾸고, 필요한 만큼 더하기 한 후, today와 비교 하는 식으로 구현 하려고 했다. 하지만 이렇게 하면 더하면서  12월을 넘은 경우, 1일 인 경우 예외 처리를 해야 하는데 이 과정이 복잡했다.

그래서 애초에 처음부터 년, 월, 일을 일로 변환하여 계산하고, 이를 비교하면 깔끔해게 해결 된다.

terms의 경우는 Map 형식으로 바꿔서, O(1)으로 term을 찾을 수 있어서, O(n)의 시간 복잡도로 구현 가능하다.

 

코드

import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        
        StringTokenizer st = new StringTokenizer(today, ".");
        
        int todaySum = 0;
      
        todaySum += Integer.parseInt(st.nextToken()) * 12 * 28 +
            Integer.parseInt(st.nextToken()) * 28 +
            Integer.parseInt(st.nextToken());
        
        Map<String, Integer> termsMap = new HashMap<>();
        
        for(int i = 0; i < terms.length; i++) {
            st = new StringTokenizer(terms[i], " ");
            termsMap.put(st.nextToken(), Integer.parseInt(st.nextToken()) * 28);
        }
        
        List<Integer> answerList = new ArrayList<>();
        
        for(int i = 0; i < privacies.length; i++) {
            st = new StringTokenizer(privacies[i], ".| ");
            int curSum = 0;
            curSum += Integer.parseInt(st.nextToken()) * 12 * 28 +
                Integer.parseInt(st.nextToken()) * 28 +
                Integer.parseInt(st.nextToken()) +
                termsMap.get(st.nextToken());
            
            if (todaySum >= curSum) {
                answerList.add(i + 1);
            }
        }
    
        int[] answer = answerList.stream()
                .mapToInt(Integer::intValue)
                .toArray();
  
        return answer;
    }
}

느낀 점

string 형식의 날짜나 시간이 나오는 경우 미리 다 합쳐놓고 비교해야겠다.

localdatetime 형식으로도 풀어볼 예정.