```java
import java.util.*;
// 20:37 START! 21:04 END! (약 30분)
// 문자열 + 자료구조(Map)
class Solution {
/**
* 1. privacies를 돌면서 해당 개인정보가 만료되는 날짜를 구한다.=> O(n), 1 <= n <= 100
* - 약관 종류를 통해 유효기간을 파악하기 위해서 Map 자료구조를 사용한다 => O(m), 1 <= m <= 20
* 2. 만료날짜와 오늘 날짜를 비교한다. (💡 년월일, 시분초로 되어있을 때는 가장 작은 단위로 계산하면 편함)
*/
public int[] solution(String today, String[] terms, String[] privacies) {
Map map = new HashMap<>();
for(String term : terms) {
String[] infos = term.split(" ");
map.put(infos[0], Integer.parseInt(infos[1]) * 28);
}
int todays = toDays(today); // 년/월/일을 '일'로 바꾸기!
List needToRemove = new ArrayList<>();
for(int i = 0; i < privacies.length; ++i) {
String[] infos = privacies[i].split(" ");
int beginAt = toDays(infos[0]);
int expaireAt = beginAt + map.get(infos[1]);
if(todays >= expaireAt) {
needToRemove.add(i + 1);
}
}
int[] answer = new int[needToRemove.size()];
for(int i = 0; i < needToRemove.size(); ++i) {
answer[i] = needToRemove.get(i);
}
return answer;
}
public int toDays(String date) {
String[] infos = date.split("\\.");
int days = 0;
days += Integer.parseInt(infos[0]) * 12 * 28;
days += Integer.parseInt(infos[1]) * 28;
days += Integer.parseInt(infos[2]);
return days;
}
}
```
코멘트
- split() 메서드를 사용할 때, '.'(점)으로 구분하려면 split("\\.") 이렇게 역슬래시를 넣어줘야 하더라구요! '.' 이 모든 문자열을 표현하는 정규식이라 그런 것 같습니다! 구글랭 했네용😅
- 코테에서 시분초 / 년월일이 나오면 가장 작은 단위(초/일)로 바꿔서 계산하면 편한 것 같습니다!
```python
def solution(today, terms, privacies):
answer = []
d = list(map(int, today.split('.'))) # 오늘 날짜를 년, 월, 일로 나눔
t = {}
# 약관과 해당 유효기간을 딕셔너리로 저장
for i in terms:
j = i.split()
t[j[0]] = int(j[1])
p = [i.split() for i in privacies] # 개인정보 수집일과 약관을 분리해서 저장
for i in range(len(p)):
p_d = list(map(int, p[i][0].split('.'))) # 수집일을 년, 월, 일로 나눔
# 수집일에 유효기간을 더함
p_d[1] += t[p[i][1]] # 유효기간의 n개월을 수집일의 월에 더함
# 월이 12월을 넘기는 경우에 년도를 더해주는 처리
while p_d[1] > 12:
p_d[0] += 1
p_d[1] -= 12
# 만료일은 정확히 계산된 유효기간 끝나는 날의 하루 전 -> 일에서 1을 뺌
p_d[2] -= 1
# 만약 일이 0이 된다면, 이전 달의 마지막 날로 처리
if p_d[2] == 0:
p_d[1] -= 1
if p_d[1] == 0:
p_d[1] = 12
p_d[0] -= 1
p_d[2] = 28 # 모든 달을 28일까지 있다고 가정
# 오늘 날짜와 만료일을 비교
if p_d[0] < d[0] or (p_d[0] == d[0] and p_d[1] < d[1]) or (p_d[0] == d[0] and p_d[1] == d[1] and p_d[2] < d[2]):
answer.append(i+1)
return answer
```
코멘트
- 각 날짜에 정해진 유효기간을 더해 만료일을 구한 후 오늘 날짜와 년, 월, 일을 직접 비교하는 방법으로 구현했습니다!
Language : Python
성능
코드 풀이
```python
def solution(today, terms, privacies):
# 약관 종류에 따른 유효기간을 저장할 딕셔너리
term_dict = {}
for term in terms:
info = term.split(" ")
term_dict[info[0]] = int(info[1]) * 28 # 월 -> 일 단위로 변환
# 오늘 날짜를 일로 변환
todays = to_days(today)
# 만료된 개인정보 번호를 저장할 리스트
answer = []
for i, privacy in enumerate(privacies):
info = privacy.split(" ")
begin_at = to_days(info[0])
expire_at = begin_at + term_dict[info[1]]
# 만료일이 오늘보다 작거나 같다면 해당 개인정보 만료 처리
if todays >= expire_at:
answer.append(i + 1)
return answer
# '년.월.일' 형식을 일 단위로 변환하는 함수
def to_days(date):
infos = date.split(".")
days = 0
days += int(infos[0]) * 12 * 28 # 년 -> 일로 변환
days += int(infos[1]) * 28 # 월 -> 일로 변환
days += int(infos[2]) # 일 그대로 더함
return days
```
🔗 개인정보 수집 유효기간