본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 150370번: 개인정보 수집 유효 기간 [Java]

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

 

프로그래머스

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

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public List <Integer> solution(String today, String[] terms, String[] privacies) {
        List <Integer> answer = new ArrayList<>();
        for(int i = 0; i < privacies.length; i++) {
            int year = Integer.parseInt(privacies[i].substring(0, 4));
            int month = Integer.parseInt(privacies[i].substring(5, 7));
            int day = Integer.parseInt(privacies[i].substring(8, 10));
            int term = 0;
            
            for(int j = 0; j < terms.length; j++) {
                if(privacies[i].charAt(11) == terms[j].charAt(0)) {
                    term = Integer.parseInt(terms[j].substring(2));
                    break;
                }
            }
            
            for(int j = 1; j <= term * 28; j++) {
                if(++day > 28) {
                    day = 1;
                    if(++month > 12) {
                        month = 1;
                        year++;
                    }
                }
            }
            
            StringBuilder limit = new StringBuilder();
            limit.append(year);
            if(month < 10) limit.append(".0").append(month);
            else limit.append(".").append(month);
            
            if(day < 10) limit.append(".0").append(day);
            else limit.append(".").append(day);
            
            if(limit.toString().compareTo(today) <= 0)
                answer.add(i + 1);
        }
        return answer;
    }
}

2. 설명

List <Integer> answer = new ArrayList<>();
for(int i = 0; i < privacies.length; i++) {
    int year = Integer.parseInt(privacies[i].substring(0, 4));
    int month = Integer.parseInt(privacies[i].substring(5, 7));
    int day = Integer.parseInt(privacies[i].substring(8, 10));
    int term = 0;

반복문을 통해서 privacies에 접근하여 날짜 정보를 연도, 월, 일을 각각의 정수형으로 분리하여 저장합니다.

    for(int j = 0; j < terms.length; j++) {
        if(privacies[i].charAt(11) == terms[j].charAt(0)) {
            term = Integer.parseInt(terms[j].substring(2));
            break;
        }
    }

그리고 반복문을 통해서 privacies에 약관의 정보와 terms에 약관의 정보가 동일한 것을 찾아 terms의 기간을 찾아내어 저장합니다.

    for(int j = 1; j <= term * 28; j++) {
        if(++day > 28) {
            day = 1;
            if(++month > 12) {
                month = 1;
                year++;
            }
        }
    }

그리고 terms의 기간만큼 날짜를 올려줍니다. day부터 month, year 순차적으로 올립니다. 그렇게 되면 결과적으로 정보 보관이 불가능한 파기일의 첫 번째 날이 됩니다.

    StringBuilder limit = new StringBuilder();
    limit.append(year);
    if(month < 10) limit.append(".0").append(month);
    else limit.append(".").append(month);

    if(day < 10) limit.append(".0").append(day);
    else limit.append(".").append(day);

    if(limit.toString().compareTo(today) <= 0)
        answer.add(i + 1);

월과 일이 10 이하라면 0을 붙여서 날짜를 문자열로 만들어 줍니다. 그리고 compareTo를 이용하여 파기일과 동일하거나 크다면 해당 개인정보는 파기해야 하는 정보이기에 answer에 추가해 줍니다.

3. 정리

  1. 날짜 정보를 분리하여 순차적으로 증가
  2. 날짜로서 비교하기 위해 비교 대상 형식 통일
  3. compareTo를 이용하여 날짜 비교
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges