Welcome! Everything is fine.

[프로그래머스/Lv.1] 개인정보 수집 유효기간(2023 KAKAO BLIND RECRUITMENT) - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 개인정보 수집 유효기간(2023 KAKAO BLIND RECRUITMENT) - Java

개발곰발 2024. 4. 15.
728x90

📌 문제

 

프로그래머스

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

programmers.co.kr

📌 풀이

terms 배열만 HashMap에 넣어놓고 고민만 하다 끝나버린 문제.. 날짜나 시간을 다루는 게 아직 익숙하지 않아서 많이 풀어봐야할 것 같다. 내가 생각했던 풀이는 다음과 같다.

  •  terms 배열을 HashMap에 저장한다.
  • privacies 배열을 돌면서 개인정보 수집일자와 약관 종류를 불러온다.
    • 개인정보 수집일자 + 약관 종류에 따른 유효기간의 값이 오늘 날짜보다 작거나 같으면 유효기간이 지난 것이므로 파기해야한다.
    • 파기해야 할 개인정보의 번호(인덱스)를 리스트에 추가한다.

날짜를 년, 월, 일 하나씩 따로 비교해야할지, 어떻게 변환해야할지 감이 오지 않아서 답을 보고 다시 풀었다. 찾아보니 년, 월, 일로 된 날짜를 총 날짜 수로 변환하는 식이 있었다.

(연도 * 12개월 * 28일) + (월 * 28일) + 일

 

제일 먼저 today의 값을 총 날짜로 변환해야 하는데, 날짜 문자열을 넣으면 총 날짜를 반환하는 메서드를 만든다. 사실 2024.04.15와 같은 형식으로 된 문자열을 어떻게 나눌지 몰랐는데, today.split("\\.") 과 같이 하면 된다. 정규표현식에서 점(.)을 그냥 쓰면 어떠한 문자와도 매칭된다는 사실을 잊고 있었는데, 점(.) 그 자체를 나타내고 싶다면 "\\." 으로 작성해야 한다. 이렇게 총 날짜로 변환해주는 getDate() 메서드를 만들어 오늘 날짜를 총 날짜 수로 변환해준다.

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;
}

 

그리고나서 terms 배열을 {"약관종류" = "유효 기간"} 형태로 HashMap에 저장해준다. 나중에 privacies의 약관 종류에 따라 유효기간을 불러오기 위해 필요한 작업이다. 공백을 기준을 나눈 후 0번째 인덱스(약관 종류)를 key로, 1번째 인덱스(유효 기간)를 value로 저장한다.

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

 

그 다음, privacies 배열을 돌면서 ["날짜  약관 종류"] 형태로 된 데이터를  공백을 기준으로 잘라 파기되어야 하는 정보인지 판단한다. 0번째 인덱스(날짜)의 총 날짜 수와 1번째 인덱스(약관 종류)를 key로 갖는 value의 값의 총 날짜 수를 더하고, 그 값이 오늘 날짜보다 작거나 큰지 확인한다. 오늘 날짜가 크거나 둘이 같다면 유효 기간이 지난 것이므로 파기해야 할 정보이다.

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

    if (getDate(privacy[0]) + (map.get(privacy[1]) * 28) <= date) {
        System.out.println(getDate(privacy[0]) + (map.get(privacy[1]) * 28));
        answer.add(i + 1);
    }
}

 

배열을 모두 돌았다면 리스트를 int형 배열로 바꿔 리턴한다. 맨날 반목문으로 하나하나 꺼내서 배열에 담았는데 오늘은 새롭게 스트림을 사용해서 리스트 -> 배열로 바꾸는 방법을 공부했다.

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> map = new HashMap<>();
        int date = getDate(today);

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

            if (getDate(privacy[0]) + (map.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;
    }
}