모든 달의 일을 28일로 두고 계산한다고 가정하였기 때문에 정수로 바꾸어 크키를 비교하여 폐기여부를 결정하는 알고리즘을 짜서 해결하고자 하였다.
<사전 생각>
정수(Int) 의 범위는 -2^31 ~ 2^31-1 약 (-21억~+21억) 사이 이기 때문에 정수 범위를 초과하여 문제가 발생하는 경우는 없다고 생각하고
"1971.11.01" 식의 문자열을 분리 하여야 하는데 split() 함수를 사용할 수 도 있겠지만
해당 Built-in 함수는 시간소모가 크다는 걸 LeetCode 로 충분히 경험 하였기 때문에 가급적 subString() 함수로 해결하고자 하였다.
<최종 코드>
import java.util.Vector;
// split() 함수를 안쓰는 이유는 시간적으로 소모가 크기 때문 가급적 substring()으로 해결
class Solution {
// "1971.12.01" 형식의 날짜를 day 수로 변환하는 함수
private int getParseIntDay(String date){
int day = 0;
day+=Integer.parseInt(date.substring(0,4))*28*12;
day+=Integer.parseInt(date.substring(5,7))*28;
day+=Integer.parseInt(date.substring(8,10));
return day;
}
// 시간 복잡도 O(nm) 공간 복잡도 O(n+m);
public int[] solution(String today, String[] terms, String[] privacies) {
// 당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
int[] answer = {};
int dDay = getParseIntDay(today); // 마감기한 구하기
int[] privaciesInt = new int[privacies.length]; // 저장할 제품기간의 공간
Vector<Integer> v = new Vector<Integer>(); // 폐기해야 할 데이터의 번호들을 효과적을 저장할 자료구조
// 제품의 유통기한을 day 수로 변환하여 저장
for(int i=0;i<privaciesInt.length;i++)
privaciesInt[i] = getParseIntDay(privacies[i].substring(0,10));
// (브루트 포스) 모든 경우 검사
for(int i=0;i< privacies.length;i++){
for(int j=0;j< terms.length;j++) {
// 만약 제품의 약관 종류가 같다면 해당 약관의 day만큼 추가
if (privacies[i].charAt(privacies[i].length()-1)==
terms[j].charAt(0)){
String mouth = terms[j].substring(2,terms[j].length());
privaciesInt[i]+=Integer.parseInt(mouth)*28;
}
}
}
// 폐기해야할 제품 번호 저장
for(int i=0;i<privaciesInt.length;i++){
if(dDay>=privaciesInt[i])
v.add(i+1);
}
int ans[] = new int[v.size()];
for(int i=0;i<ans.length;i++)
ans[i] = v.get(i);
answer = ans;
return answer;
}
}
<더 생각해봐야 할 점>
다른 분들의 답안을 보면 나와 같이 숫자로 변환하여 처리하지 않고 날짜 형식으로 format 처리 하여 푼 걸 볼 수 있었는데
그런 방향의 풀이도 고안해 보아야 할 것 같다.
<링크>
https://school.programmers.co.kr/learn/courses/30/lessons/150370
'PS > Level1' 카테고리의 다른 글
Programmers School level 1: 신규 아이디 추천 (0) | 2023.01.24 |
---|---|
Programmers School level 1: 성격 유형 검사하기 (1) | 2023.01.22 |
Programmers School level 1: 신고 결과 받기 (1) | 2023.01.20 |
Programmers School level 1: 숫자 문자열과 영단어 (0) | 2023.01.18 |
Programmers School level 1: 키패드 누르기 (0) | 2023.01.16 |