[Programmers] Lv1 개인정보 수집 유효기간 Java

2023. 2. 3. 15:59CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

  • 이 문제는 날짜를 계산하고 비교해야 된다.
  • 여기서 모든 월은 28일이라고 하니 아래와 같이 하나의 값으로 대체할 수 있다.
  • 값 = year12/28 + month*28 + day
  • 이를 이용하면 날짜 덧셈과 비교가 간단해진다.
  • 위를 알고 있으면 이 문제는 다음과 같이 간단하게 변환 된다.
  • 날짜를 term 만큼 더한 후 오늘날짜와 비교하고 파기해야 할 정보를 List에 담는다
    • 여기서 term을 HashMap을 이용하여 키와 값으로 이용하기 편리한 상태로 변환해서 더했다.
    • 이후 파기해야 하는 것을 리스트에 인덱스 값을 넣고 그것을 스트림을 이용하여 Integer을 int로 변환하였다.

 

소스 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Solution {

    public int get_date(String date) {
        int[] datesArr = Arrays.stream(date.split("\\\\.")).mapToInt(Integer::parseInt).toArray();
        return datesArr[0] * 12 * 28 + datesArr[1] * 28 + datesArr[2];
    }

    public int[] solution(String today, String[] terms, String[] privacies) {

        HashMap<String, Integer> termMap = new HashMap<>();
        for(String term : terms) {
            String[] termArr = term.split(" ");
            termMap.put(termArr[0], Integer.parseInt(termArr[1]));
        }

        int index = 1;
        ArrayList<Integer> result = new ArrayList<>();
        for (String privacyS : privacies) {
            String[] priDateAndTerm = privacyS.split(" ");
            if (get_date(priDateAndTerm[0]) + termMap.get(priDateAndTerm[1]) * 28 <= get_date(today))
                result.add(index);
            index++;
        }
        
        return Arrays.stream(result.toArray()).mapToInt(i->(int)i).toArray();
    }
}
728x90