Cute Running Puppy
본문 바로가기
개발일기/알고리즘

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

by 징구짱 2023. 7. 12.
728x90

 

split 함수

우선 오늘 날짜를 "." 기준으로 나눠주었다.

split 함수의 인자는 정규표현식 (Regex) 패턴이다.

 

정규식에서 .은 임의의 한 글자를 나타낸다.

"."으로 분할하면 모든 문자와 일치하므로 배열에 아무것도 남지 않게 된다.

today.split("."); // 빈 배열

 

 

"." 문자 그 자체로 분할하려면 이스케이프 문자인 "\\."를 사용해야 한다.

또는 "[.]" 와 같이 대괄호로 감싸면 문자 그 자체로 인식한다.

// "."으로 분리하기 둘 다 사용 가능
today.split("\\.");
today.split("[.]");

이것은 String 배열로 반환되는데 계산이 쉽도록 변환하여 int 배열에 넣어줄 것이다.

// stream : 배열을 더 편리하게 가공하고 처리하도록 해주는 반복자
int[] daysint = Arrays.stream(today.split("\\."))
        .mapToInt(Integer::parseInt)
        .toArray();

 

 

유효기간 일자 구하기

각각 오늘 날짜 기준으로 유효기간 일자를 구해주었다.

그냥 대입하면 주소가 대입된다.

따라서 clone해서 대입! (이것이 바로 Call by reference?)

for (String term : terms) {
    int[] daysCopy = daysint.clone();
	...
}

 

term을 " "기준으로 split하면 약관 종류와 유효기간을 알 수 있다.

오늘 날짜의 월에서 유효기간을 빼준 후 1보다 작은지 비교해주었다.

1보다 작다면 년도와 월을 변환해준다.

for (String term : terms) {
	...
    String[] termSplit = term.split(" ");
    daysCopy[1] = daysint[1] - Integer.parseInt(termSplit[1]);
    if (daysCopy[1] < 1) {
        daysCopy[0] += (daysCopy[1] / 12 - 1);
        daysCopy[1] = 12 + daysCopy[1] % 12;
    }
	...
}

예시

더보기

daysCopy : {2022, 0, 19}

-> daysCopy : {2021, 12, 19}

 

daysCopy[1] 가 0이면

년도에 0 / 12 - 1 = -1을 더해야한다.

월은 0 % 12 = 0을 12월에서 더해야한다.

-> 따라서 daysCopy : {2021, 12, 19}

 

 

daysCopy : {2022, -7, 19}

-> daysCopy : {2021, 5, 19}

 

daysCopy[1] 가 -7이면

년도에 -7 / 12 - 1 = -1을 더해야한다.

월은 -7 % 12 = -7을 12월에서 더해야한다.

-> 따라서 daysCopy : {2021, 5, 19}

 

 

daysCopy : {2022, -15, 19}

-> daysCopy : {2020, 9, 19}

 

daysCopy[1] 가 -15이면

년도에 -15 / 12 - 1 = -2을 더해야한다.

월은 -15 % 12 = -3을 12월에서 더해야한다.

-> 따라서 daysCopy : {2020, 9, 19}

 

비교를 위해 합쳐서 Map에 저장 날짜로 비교하기 위해 형식을 정해서 저장하였음

HashMap<String, Integer> dayMap = new HashMap<>();

for (String term : terms) {
	...
    dayMap.put(termSplit[0], Integer.parseInt(Arrays.stream(daysCopy)
            .mapToObj(num -> String.format("%02d", num))
            .reduce("", (a, b) -> a + b)));
}

예시

더보기

daysCopy : {2021, 5, 19}

 

.mapToObj(num -> String.format("%02d", num)) -> 두 자리 정수로 표시

2021 -> 2021

5 -> 05

19 -> 19

 

.reduce("", (a, b) -> a + b))); -> 요소들을 연결하여 하나의 문자열로 만들기

2021

202105

20210519

 

{2021, 5, 19} -> 20210519

 

 

 

.collect(Collectors.joining(".")));  -> "."으로 구분하여 합칠 수도 있음

2021

2021.5

2021.5.19

 

{2021, 5, 19} -> 2021.5.19

 

 

비교한 후 위치에 대한 정보를 List에 추가한 후

List를 배열로 변환 후 return 하였음

List<Integer> count = new ArrayList<>();
for (int i = 0; i < privacies.length; i++) {
    String[] num = privacies[i].split(" ");
    if (Integer.parseInt(num[0].replace(".", "")) <= dayMap.get(num[1])) count.add(i+1);
}


int[] answer = new int[count.size()];
for (int i = 0; i < count.size(); i++) {
    answer[i] = count.get(i);
}

return answer;
728x90