| 문제 출처 | 제목 | 난이도 |
|---|
| 2023 KAKAO BLIND RECRUITMENT | 개인정보 수집 유효기간 | Lv. 1 |
개인정보 수집 유효기간
해결코드:
import java.util.*;
class Solution {
public List<Integer> solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
for(int i=0; i<terms.length; i++){
String[] tmp = terms[i].split(" ");
map.put(tmp[0], Integer.parseInt(tmp[1]));
}
String[] tmp = today.split("\\.");
int todays = Integer.parseInt(tmp[0])*12*28 + Integer.parseInt(tmp[1])*28 + Integer.parseInt(tmp[2]);
for(int i=0; i<privacies.length; i++){
String[] input = privacies[i].split(" ");
String[] dates = input[0].split("\\.");
int days = Integer.parseInt(dates[0])*12*28 + Integer.parseInt(dates[1])*28 + Integer.parseInt(dates[2]);
days += map.get(input[1]) * 28;
if(todays >= days){
answer.add(i+1);
}
}
return answer;
}
}
고민의 시간과 해결 방법:
- 문자열을 가지고 하는 문제라 많은 에러와 디버깅을 통해 해결하였다
- split을 적극적으로 활용하는 문제였고, 추가적으로 map을 사용하여 더 쉽게 해결하였다
- terms를 문제에서 알파벳이 중복되지 않는다는 조건이 주어졌기 때문에 map을 사용하여 깔끔하게 저장하였다. (만약 map을 못 쓴다면 if문을 또 빼곡하게 작성해야했을 것이다..)
- 날짜를 연도, 월, 일로 split해서 저장하고 또 각각을 비교할까 했는데, 또 이러면 if문을 빼곡하게 작성해야하고 변수의 수도 너무 늘어나서 코드 작성도중 헤매이게 된다...
- 따라서 아예 전부 일로 통일해서 하나의 변수에 저장하고 비교하도록 하였다
- 연도에는 12와 28을 곱해주고 월에는 28을 곱해서 todays라는 변수에 저장한다
- 이제 privacies배열을 순회한다. 두번의 split을 진행해서 똑같이 days라는 변수에 5~6번을 진행해주고 추가로 처음 split했을 때의 알파벳을 이용하여 map에서 해당하는 값을 찾아 days에 월이기 때문에 28을 곱해서 더해준다
- 마지막으로 비교를 진행한다. todays가 days보다 크거나 같으면 answer에 i+1을 add한다. 처음 문제에서 주어진 반환타입은 배열이었으나 그 크기를 짐작할 수 없으므로 List로 바꿔서 리턴하였다.
문제 링크:
개인정보 수집 유효기간