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);
}
}
}
}
}
차라리 (yaer*12*28) + (month*28) + day
로 일수로 계산했다면 편했을 것이다.
이분은 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;
}
}