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;
'개발일기 > 알고리즘' 카테고리의 다른 글
[백준] 1, 2, 3 더하기 - 자바 (0) | 2023.07.16 |
---|---|
[알고리즘] DP? 다이나믹 프로그래밍 (0) | 2023.07.16 |
[프로그래머스] 뒤에 있는 큰 수 찾기 - 자바 (0) | 2023.07.01 |
[프로그래머스] 귤 고르기 - 자바 (0) | 2023.06.30 |
프로그래머스 깃허브로 자동 커밋 (0) | 2023.05.17 |