일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 인프런
- java
- 카카오코테
- 코테
- Android
- 오블완
- Til
- MySQL
- 안드로이드
- select
- 자바
- 자료구조
- CS
- 정처기
- 티스토리챌린지
- 안드로이드스튜디오
- 코틀린
- 혼공파
- doitandroid
- 스터디
- groupby
- SQL
- Kotlin
- 프로그래머스
- 정보처리기사
- 혼공단
- 혼공챌린지
- 기술면접
- join
- 알고리즘
- Today
- Total
Welcome! Everything is fine.
[프로그래머스/Lv.1] 개인정보 수집 유효기간(2023 KAKAO BLIND RECRUITMENT) - Java 본문
📌 문제
📌 풀이
terms 배열만 HashMap에 넣어놓고 고민만 하다 끝나버린 문제.. 날짜나 시간을 다루는 게 아직 익숙하지 않아서 많이 풀어봐야할 것 같다. 내가 생각했던 풀이는 다음과 같다.
- terms 배열을 HashMap에 저장한다.
- privacies 배열을 돌면서 개인정보 수집일자와 약관 종류를 불러온다.
- 개인정보 수집일자 + 약관 종류에 따른 유효기간의 값이 오늘 날짜보다 작거나 같으면 유효기간이 지난 것이므로 파기해야한다.
- 파기해야 할 개인정보의 번호(인덱스)를 리스트에 추가한다.
날짜를 년, 월, 일 하나씩 따로 비교해야할지, 어떻게 변환해야할지 감이 오지 않아서 답을 보고 다시 풀었다. 찾아보니 년, 월, 일로 된 날짜를 총 날짜 수로 변환하는 식이 있었다.
(연도 * 12개월 * 28일) + (월 * 28일) + 일
제일 먼저 today의 값을 총 날짜로 변환해야 하는데, 날짜 문자열을 넣으면 총 날짜를 반환하는 메서드를 만든다. 사실 2024.04.15와 같은 형식으로 된 문자열을 어떻게 나눌지 몰랐는데, today.split("\\.") 과 같이 하면 된다. 정규표현식에서 점(.)을 그냥 쓰면 어떠한 문자와도 매칭된다는 사실을 잊고 있었는데, 점(.) 그 자체를 나타내고 싶다면 "\\." 으로 작성해야 한다. 이렇게 총 날짜로 변환해주는 getDate() 메서드를 만들어 오늘 날짜를 총 날짜 수로 변환해준다.
private int getDate(String today) {
String[] date = today.split("\\.");
int year = Integer.parseInt(date[0]);
int month = Integer.parseInt(date[1]);
int day = Integer.parseInt(date[2]);
return (year * 12 * 28) + (month * 28) + day;
}
그리고나서 terms 배열을 {"약관종류" = "유효 기간"} 형태로 HashMap에 저장해준다. 나중에 privacies의 약관 종류에 따라 유효기간을 불러오기 위해 필요한 작업이다. 공백을 기준을 나눈 후 0번째 인덱스(약관 종류)를 key로, 1번째 인덱스(유효 기간)를 value로 저장한다.
for (String s : terms) {
String[] term = s.split(" ");
map.put(term[0], Integer.parseInt(term[1]));
}
그 다음, privacies 배열을 돌면서 ["날짜 약관 종류"] 형태로 된 데이터를 공백을 기준으로 잘라 파기되어야 하는 정보인지 판단한다. 0번째 인덱스(날짜)의 총 날짜 수와 1번째 인덱스(약관 종류)를 key로 갖는 value의 값의 총 날짜 수를 더하고, 그 값이 오늘 날짜보다 작거나 큰지 확인한다. 오늘 날짜가 크거나 둘이 같다면 유효 기간이 지난 것이므로 파기해야 할 정보이다.
for (int i = 0; i < privacies.length; i++) {
String[] privacy = privacies[i].split(" ");
if (getDate(privacy[0]) + (map.get(privacy[1]) * 28) <= date) {
System.out.println(getDate(privacy[0]) + (map.get(privacy[1]) * 28));
answer.add(i + 1);
}
}
배열을 모두 돌았다면 리스트를 int형 배열로 바꿔 리턴한다. 맨날 반목문으로 하나하나 꺼내서 배열에 담았는데 오늘은 새롭게 스트림을 사용해서 리스트 -> 배열로 바꾸는 방법을 공부했다.
return answer.stream().mapToInt(integer -> integer).toArray();
📌 전체 코드
import java.util.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
int date = getDate(today);
for (String s : terms) {
String[] term = s.split(" ");
map.put(term[0], Integer.parseInt(term[1]));
}
for (int i = 0; i < privacies.length; i++) {
String[] privacy = privacies[i].split(" ");
if (getDate(privacy[0]) + (map.get(privacy[1]) * 28) <= date) {
answer.add(i + 1);
}
}
return answer.stream().mapToInt(integer -> integer).toArray();
}
private int getDate(String today) {
String[] date = today.split("\\.");
int year = Integer.parseInt(date[0]);
int month = Integer.parseInt(date[1]);
int day = Integer.parseInt(date[2]);
return (year * 12 * 28) + (month * 28) + day;
}
}
'프로그래머스 > Lv.1' 카테고리의 다른 글
[프로그래머스/Lv.1] 바탕화면 정리 - Java (0) | 2024.04.16 |
---|---|
[프로그래머스/Lv.1] 카드뭉치 - Java (0) | 2024.04.16 |
[프로그래머스/Lv.1] 달리기 경주 - Java (0) | 2024.04.12 |
[프로그래머스/Lv.1] 비밀지도(2018 KAKAO BLIND RECRUITMENT) - Java (0) | 2024.04.12 |
[프로그래머스/Lv.1] 가장 가까운 같은 글자 - Java (0) | 2024.04.11 |