카카오 문제치고 쉬운 문제였다.
인풋 값도 적어서 시간 초과를 생각하지 않고 편한 마음으로 풀었다.
Date와 SimpleDateFormat를 이용해서 계산하는 방법도 생각했지만
그냥 계산하는게 더 간단해 보여서 사용하지는 않았다.
로직
먼저 terms 배열을 순회하며 map에 약관종류와 유효기간을 넣어준다.
그리고 privacies를 순회하며 약관 종류에 맞는 유효기간을 가져와 cal 메서드를 호출한다.
유효기간이 1이 될 때까지 날짜를 계산하여 년월일을 일자로 바꾸어 현재 날짜와 비교한다.
cal 메서드의 반환값이 false이면 list에 추가하고 모든 순회가 끝나면 stream을 이용해 배열로 변환한다.
최종 코드
import java.util.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
int[] answer = {};
// 유효기간을 담을 map
Map<String, Integer> map = new HashMap<>();
// 파기해야할 정보를 담을 list
List<Integer> list = new ArrayList<>();
// terms을 순회하며 map에 삽입
for(String s : terms) {
String[] temp = s.split(" ");
map.put(temp[0], Integer.parseInt(temp[1]) * 28);
}
// privacies를 순회하며 cal()메서드 호출
for(int i = 0; i < privacies.length; i++) {
String[] pSplit = privacies[i].split(" ");
int valid = map.get(pSplit[1]);
if(cal(pSplit[0], valid, today)) {
list.add(i + 1);
}
}
answer = list.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
// 날짜 계산 메서드
public boolean cal(String date, int valid, String today) {
int[] dateSplit = Arrays.stream(date.split("\\.")).mapToInt(Integer::parseInt).toArray();
int[] todaySplit = Arrays.stream(today.split("\\.")).mapToInt(Integer::parseInt).toArray();
// valid가 1이 될떄까지 유효날짜 계산
while(valid > 1) {
dateSplit[2]++;
valid--;
if(dateSplit[2] > 28) {
dateSplit[2] = 1;
dateSplit[1]++;
}
if(dateSplit[1] > 12) {
dateSplit[1] = 1;
dateSplit[0]++;
}
}
// 계산한 유효날짜와 현재 날짜를 일수로 바꿔 비교
int todayResult = todaySplit[0] * 12 * 28 + todaySplit[1] * 28 + todaySplit[2];
int dateResult = dateSplit[0] * 12 * 28 + dateSplit[1] * 28 + dateSplit[2];
// 계산한 유효날짜가 현재 날짜보다 크거나 같으면 false 리턴
if(dateResult >= todayResult) {
return false;
}
return true;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 - 연속 부분 수열 합의 개수 (0) | 2023.04.28 |
---|---|
(Java) 프로그래머스 - 공원 산책 (0) | 2023.04.26 |
(Java) 백준 15652 - N과 M (4) (0) | 2023.02.17 |
(Java) 프로그래머스 - 둘만의 암호 (0) | 2023.02.16 |
(Java) 프로그래머스 - 카드 뭉치 (0) | 2023.02.16 |