개인정보 수집 유효기간 (자바)

김재현·2023년 12월 10일
0

알고리즘 풀이

목록 보기
47/89

문제

정답 코드

import java.util.*;

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

        List<Integer> result = new ArrayList<>();

        String yearToday = "";
        String monthToday = "";
        String dayToday = "";

        for (int i=0;i<4;i++) {
            yearToday+=today.charAt(i);
        }
        for (int i=0; i<2;i++) {
            monthToday += today.charAt(i+5);
            dayToday += today.charAt(i+8);
        }
        int yearT=Integer.valueOf(yearToday);
        int monthT=Integer.valueOf(monthToday);
        int dayT=Integer.valueOf(dayToday);


        int privacyIndex=0;
        for (String privacy : privacies) {
            privacyIndex++;
            for (String term : terms) {
                if (term.charAt(0)==privacy.charAt(11)) {  // 약관 확인

                    // 연 월 일
                    String yearString ="";
                    for (int i=0;i<4;i++) {
                        yearString+=privacy.charAt(i);
                    }
                    String monthString = "";
                    String dayString = "";
                    for (int i=0; i<2;i++) {
                        monthString += privacy.charAt(i+5);
                        dayString += privacy.charAt(i+8);
                    }
                    int year=Integer.valueOf(yearString);
                    int month=Integer.valueOf(monthString);
                    int day=Integer.valueOf(dayString);

                    // 약관을 계산해보자
                    day=day-1;
                    if (day==0) {
                        month=month-1;
                        day=28;
                    }

                    if (month==0) {
                        year=year-1;
                        month=12;
                    }

                    month = month + Integer.parseInt(term.substring(2));

                    
                    while (month>12) {
                        year=year+1;
                        month=month-12;
                    }

                    // 계산된 약관보다 today가 크면 폐기 -> privacyIndex를 result에 담기
                    if (yearT>year || (year==yearT && monthT>month) || (year==yearT && month==monthT && dayT>day)) {
                        result.add(privacyIndex);
                    }
                }
            }
        }

        int[] answer = result.stream().mapToInt(Integer::intValue).toArray();


        return answer;
    }
}

처음부터 substring으로 풀었다면 보기 좋았을 것 같아 변형해보았다.

정답코드 정리

import java.util.*;

class Solution {
ic int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> result = new ArrayList<>();

        int yearT = Integer.parseInt(today.substring(0, 4));
        int monthT = Integer.parseInt(today.substring(5, 7));
        int dayT = Integer.parseInt(today.substring(8, 10));

        for (int i = 0; i < privacies.length; i++) {
            String privacy = privacies[i];
            int privacyIndex = i + 1;

            for (String term : terms) {
                char termType = term.charAt(0);
                if (termType == privacy.charAt(11)) {
                    int year = Integer.parseInt(privacy.substring(0, 4));
                    int month = Integer.parseInt(privacy.substring(5, 7));
                    int day = Integer.parseInt(privacy.substring(8, 10));

                    // 약관 종료일 계산
                    day = day - 1;
                    if (day == 0) {
                        month = month - 1;
                        day = 28;
                    }

                    month = month + Integer.parseInt(term.substring(2));

                    while (month > 12) {
                        year = year + 1;
                        month = month - 12;
                    }

                    // 날짜 비교 및 폐기
                    if (yearT > year || (year == yearT && monthT > month) || (year == yearT && month == monthT && dayT > day)) {
                        result.add(privacyIndex);
                    }
                }
            }
        }
}

다른 사람 풀이

1. 연월일을 일수로 계산

차라리 (yaer*12*28) + (month*28) + day 로 일수로 계산했다면 편했을 것이다.

2. split 메서드 활용

이분은 split 메서드 활용 뿐만 아니라 이렇게 getDate()라는 함수를 만들 생각을 하셨다.
대단...!!!

그리고 이런 식으로 람다를 사용할수도 있구나 싶다.
return answer.stream().mapToInt(integer -> integer).toArray();

import java.util.*;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        Map<String, Integer> termMap = new HashMap<>();
        int date = getDate(today);

        for (String s : terms) {
            String[] term = s.split(" ");

            termMap.put(term[0], Integer.parseInt(term[1]));
        }
        for (int i = 0; i < privacies.length; i++) {
            String[] privacy = privacies[i].split(" ");

            if (getDate(privacy[0]) + (termMap.get(privacy[1]) * 28) <= date) {
                answer.add(i + 1);
            }
        }
        return answer.stream().mapToInt(integer -> integer).toArray();
    }

    private int getDate(String today) {
        String[] date = today.split("\\.");
        int year = Integer.parseInt(date[0]);
        int month = Integer.parseInt(date[1]);
        int day = Integer.parseInt(date[2]);
        return (year * 12 * 28) + (month * 28) + day;
    }
}
profile
I live in Seoul, Korea, Handsome

0개의 댓글