2024-TEAM-05 / algorithm-for-kakao

카카오 기출 문제 가즈아🐣
0 stars 0 forks source link

[2023 KAKAO BLIND RECRUITMENT] 개인정보 수집 유효기간 #6

Open uijin-j opened 1 week ago

uijin-j commented 1 week ago

🔗 개인정보 수집 유효기간

hye-on commented 1 week ago

풀어서 패스하겠숩니당

uijin-j commented 1 week ago

코드 풀이

```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("\\.") 이렇게 역슬래시를 넣어줘야 하더라구요! '.' 이 모든 문자열을 표현하는 정규식이라 그런 것 같습니다! 구글랭 했네용😅
- 코테에서 시분초 / 년월일이 나오면 가장 작은 단위(초/일)로 바꿔서 계산하면 편한 것 같습니다!
toughCircle commented 1 week ago

코드 풀이

```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 ```

코멘트

- 각 날짜에 정해진 유효기간을 더해 만료일을 구한 후 오늘 날짜와 년, 월, 일을 직접 비교하는 방법으로 구현했습니다!

코드 풀이

```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 ```

코멘트

- 날짜를 일 단위로 변환하여 계산하는 방법으로 구현한 결과입니다!