이끌든지 따르든지 비키든지

Today I Learned/프로그래머스

[프로그래머스] 개인정보 수집 유효기간 - JAVA

SeongHo5 2024. 1. 18. 01:14

프로그래머스 코딩 테스트 연습 문제 -  개인정보 수집 유효기간 / JAVA 풀이 정리

 

 

프로그래머스

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

programmers.co.kr


 

풀이

 

고객의 약관 동의 일자와, 약관 종류에 따라 오늘 날짜로 파기해야 할 개인정보 번호들을 구하는 문제입니다.

 

처음에는 날짜 입력값의 "."을 "-"로 변경하고, LocalDate 타입으로 파싱 해서 LocalDate 클래스의 날짜 연산 메서드를 활용해서 풀어보려고 시도했지만, " 모든 달은 28일까지 있다고 가정합니다." 규칙으로 인해 의도한 대로 결과가 나오지 않아, 오늘 날짜와 보관 가능한 날짜를 일(day)로 변환한 날짜 간 차이가 약관 종류별 유효 기간을 초과하는지 확인하는 방법을 사용했습니다.

 

public int[] solution(String today, String[] terms, String[] privacies) {
        final int DAYS_IN_MONTH = 28;
        final int MONTHS_IN_YEAR = 12;

        Map<String, Integer> termsMap = new HashMap<>();
        List<Integer> result = new ArrayList<>();

        String[] todayParts = today.split("\\."); / "\\." - 정규표현식(Regex), "[.]"도 가능
        int currentYear = Integer.parseInt(todayParts[0]);
        int currentMonth = Integer.parseInt(todayParts[1]);
        int currentDay = Integer.parseInt(todayParts[2]);

        for (String term : terms) {
            String[] splitTerm = term.split(" ");
            termsMap.put(splitTerm[0], Integer.parseInt(splitTerm[1]));
        }
//

 

 

1. 오늘 날짜를 "."을 기준으로 분리해 연도 / 월 / 일로 분리하고, 약관 정보를 Map에 저장한다.

 

        for (int i = 0; i < privacies.length; i++) {
            String[] privacyParts = privacies[i].split(" ");
            String[] dateParts = privacyParts[0].split("\\.");
            int privacyYear = Integer.parseInt(dateParts[0]);
            int privacyMonth = Integer.parseInt(dateParts[1]);
            int privacyDay = Integer.parseInt(dateParts[2]);
		// 오늘 날짜에서 개인정보 수집 날짜를 빼고, 일 단위로 변환
            int totalDaysFromPrivacy = (currentYear - privacyYear) * DAYS_IN_MONTH * MONTHS_IN_YEAR
                    + (currentMonth - privacyMonth) * DAYS_IN_MONTH
                    + (currentDay - privacyDay);

            int expirationDays = termsMap.get(privacyParts[1]) * DAYS_IN_MONTH;

            if (totalDaysFromPrivacy >= expirationDays) {
                result.add(i + 1);
            }
        }

        return result.stream().mapToInt(i -> i).toArray();

 

 

2. privacies 배열을 순회하며, totalDaysFromPrivacy와 expirationDays을 계산한다.

( totalDaysFromPrivacy 는 개인 정보를 보관했던 총 기간(일)이라 생각하면, 조금 더 이해가 쉬울 듯?)

 

3. 계산한 totalDaysFromPrivacy가 expirationDays 보다 크거나 같다면 → 파기 대상, 결과 List에 추가한다.

 

4. 결과 List를 정수 배열로 변환해 반환한다.

 

 

(전체 코드 한 번에 보기)

더보기
public int[] solution(String today, String[] terms, String[] privacies) {
        final int DAYS_IN_MONTH = 28;
        final int MONTHS_IN_YEAR = 12;

        Map<String, Integer> termsMap = new HashMap<>();
        List<Integer> result = new ArrayList<>();

        String[] todayParts = today.split("\\.");
        int currentYear = Integer.parseInt(todayParts[0]);
        int currentMonth = Integer.parseInt(todayParts[1]);
        int currentDay = Integer.parseInt(todayParts[2]);

        for (String term : terms) {
            String[] splitTerm = term.split(" ");
            termsMap.put(splitTerm[0], Integer.parseInt(splitTerm[1]));
        }

        for (int i = 0; i < privacies.length; i++) {
            String[] privacyParts = privacies[i].split(" ");
            String[] dateParts = privacyParts[0].split("\\.");
            int privacyYear = Integer.parseInt(dateParts[0]);
            int privacyMonth = Integer.parseInt(dateParts[1]);
            int privacyDay = Integer.parseInt(dateParts[2]);

            int totalDaysFromPrivacy = (currentYear - privacyYear) * DAYS_IN_MONTH * MONTHS_IN_YEAR
                    + (currentMonth - privacyMonth) * DAYS_IN_MONTH
                    + (currentDay - privacyDay);

            int expirationDays = termsMap.get(privacyParts[1]) * DAYS_IN_MONTH;

            if (totalDaysFromPrivacy >= expirationDays) {
                result.add(i + 1);
            }
        }

        return result.stream().mapToInt(i -> i).toArray();
    }