아 이거 좀 최적화를 진짜 못시킨 느낌...
첫번째로 각 약관(ABC...)들의 유효기간을 map에 담았다. key는 약관(ABC..) value는 유효기간.
여기서 애먹었던 첫번째 String.split(".") 이게 안먹는다. 정규표현식에서 문제가 있나보다 이걸 String.split("\\.")로 사용하니까 됐다.
두번째 처음 로직을 짤 때 12월일 때 예외처리를 좀 이상하게 했다. 그래서 테스트 케이스에서 실패가 떴음.
처음 어떻게했냐면 month값에 약관에 해당하는 값을 map에서 받아서 더해준다. 이때 %12를 해서 값을 얻어오려고 했음.
그런데 생각해보니 12월일 때 12로 나누면 나머지가 0임. 잉? 뭐야 안되네? 하고 그냥 냅다 %13을 갈김; (부끄러운 수준;;)
-> 근데 테스트 케이스에서는 약관이 12개월 이하라서 문제가 안생겼는데 제출할 때 자꾸 실패가 뜸.
이거 나중에 다시 생각해보니 약관이 24개월 36개월일 때 문제가 생김
그래서 다시 12로 나누었을때 나머지가 0이면 month는 12로 다시 초기화를 해주는 식
마찬가지로 year에는 12로 나누었을 때의 몫을 넣어줬는데 month가 12일 때 몫이 1임. 따라서 month가 12일 때 예외처리만 해주면 끝!(year를 더해줄 때 -1만큼 더해주면 됨)
풀이
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.*;
class Solution {
public List<Integer> solution(String today, String[] terms, String[] privacies) {
List<Integer> answers = new ArrayList<>();
// terms map으로 변환
Map<String, Integer> map = new HashMap<>();
String key, value;
String[] splitTerms = new String[2];
for(String s : terms){
splitTerms = s.split(" ");
key = splitTerms[0];
value = splitTerms[1];
map.put(key, Integer.parseInt(value));
}
// map 확인용 출력
for (Entry<String, Integer> entrySet : map.entrySet()) {
System.out.println(entrySet.getKey() + " : " + entrySet.getValue()); }
// privacies를 .로 split()해주고 담아줄 그릇들
int month, year, day;
String term;
String[] privSplit = new String[3];
// day는 날짜와 약관을 " "로 스플릿할것. 담아줄 그릇 생성
String[] daySplit = new String[2];
// 오늘 날짜를 int로 변환하기 위해
String[] todaySplit = new String[3];
todaySplit = today.split("\\.");
// i는 인덱스용, privacyDay는 privacies의 날짜를 int로 치환용,
// todayInt는 today int 치환용
int i=1, privacyDay, todayInt;
for(String s : privacies){
//이거 왜 안됨..? split(".") 이거 안먹힘..
//year, month, day를 각각 넎어줌
privSplit = s.split("\\.");
year = Integer.parseInt(privSplit[0]);
month = Integer.parseInt(privSplit[1]);
daySplit = privSplit[2].split(" ");
day = Integer.parseInt(daySplit[0]);
// day에 같이 붙어있는 약관 뗴주기
term = daySplit[1];
// month가 12일 때 예외처리
// 12일 때 12로 나누면 몫이 1이 나오고 나머지가 0이 나옴 -> 오류임
// 12일 때 달은 month는 12로 초기화, year도 몫에서 1만큼 빼서 더해주면 됨
if((month+map.get(term))%12!=0){
year += (month + map.get(term))/12;
}else if ((month + map.get(term))%12 ==0){
year += (month + map.get(term))/12 -1;
}
// 위와 마찬가지로 month도 12월일 때 예외처리를 해줌
month += map.get(term);
if(month>12){
month%=12;
if(month%12==0) month = 12;
}
// String을 Int로 변환
privacyDay = year*10000 + month*100 +day;
todayInt = Integer.parseInt(todaySplit[0])*10000
+ Integer.parseInt(todaySplit[1])*100
+ Integer.parseInt(todaySplit[2]);
System.out.println("privacyDat is " + privacyDay);
System.out.println("todayInt is " + todayInt);
//int기 때문에 직접 연산이 가능
if(todayInt >=privacyDay){
System.out.println("i is " + i+"추가 완료");
answers.add(i);
}
i++;
}
return answers;
}
}
'공부 > 예제 풀이' 카테고리의 다른 글
[프로그래머스] 뒤에있는 큰 수 찾기 (0) | 2024.02.21 |
---|---|
[프로그래머스] 달리기 경주 (1) | 2023.12.19 |
[프로그래머스] 바탕화면 정리 (0) | 2023.12.19 |
[프로그래머스] 성격 유형 검사하기 (1) | 2023.12.19 |
[프로그래머스] 햄버거 만들기 (0) | 2023.12.19 |