첫번째로 푼 방법은 주어진 날짜의 문자열을 쪼개서 계산 후 다시 날짜로 반환하는 방법이었다.
이 과정에서 year와 month를 계산하는 과정에서 누락된 부분이 있어서 지속적으로 테스트케이스 2개정도가 틀렸었다.
다른 쉬운 방법이 없을까 고민하던 중, 날짜를 모두 일수로 계산하여 비교하면 복잡하게 날짜계산을 할 필요가 없다는게 떠올랐다.
아래의 첫번째 코드블럭은 날짜를 모두 일수로 계산하여 풀이한 방식이며, 그 아래는 오답이었지만 올려본다.
package Lv_1;
import java.util.Arrays;
public class 개인정보수집유효기간 {
public static int[] solution(String today, String[] terms, String[] privacies) {
int[] tmp_result = new int[privacies.length];
int today_year = Integer.parseInt(today.split("\\.")[0]);
int today_month = Integer.parseInt(today.split("\\.")[1]);
int today_day = Integer.parseInt(today.split("\\.")[2]);
int today_total = (today_year * 12 * 28) + (today_month * 28) + today_day;
for (String term : terms) {
String term_type = term.split(" ")[0];
int term_month = Integer.parseInt(term.split(" ")[1]);
for (int i = 0; i < privacies.length; i++) {
String privacy_date = privacies[i].split(" ")[0];
int privacy_year = Integer.parseInt(privacy_date.split("\\.")[0]);
int privacy_month = Integer.parseInt(privacy_date.split("\\.")[1]);
int privacy_day = Integer.parseInt(privacy_date.split("\\.")[2]);
int privacy_total = (privacy_year * 12 * 28) + (privacy_month * 28) + privacy_day - 1;
if (privacies[i].contains(term_type)) {
tmp_result[i] = privacy_total + (term_month * 28);
}
}
}
int expired_cnt = 0;
for (int result : tmp_result) {
if (today_total > result) {
expired_cnt++;
}
}
int[] answer = new int[expired_cnt];
int idx = 0;
int idx2 = 1;
for (int result : tmp_result) {
if (today_total > result) {
answer[idx] = idx2;
idx++;
}
idx2++;
}
return answer;
}
public static void main(String[] args) {
// String today = "2022.05.19";
// String[] terms = {"A 6", "B 12", "C 3"};
// String[] privacies = {"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"};
// String today = "2022.02.28";
// String[] terms = {"A 23"};
// String[] privacies = {"2020.01.28 A"};
String today = "2019.01.01";
String[] terms = {"B 12"};
String[] privacies = {"2017.12.21 B"};
int[] result = solution(today, terms, privacies);
System.out.println(Arrays.toString(result));
}
}
이상이 통과한 코드, 아래는 통과하지못했지만 내가 시도했던 방법이다.
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
int expired_cnt = 0;
int today_int = Integer.parseInt(today.replace(".", ""));
String[] expected_expired_date = privacies.clone();
for (int i = 0; i < privacies.length; i++) {
String privacy_date = privacies[i].split(" ")[0];
int privacy_year = Integer.parseInt(privacy_date.split("\\.")[0]);
int privacy_month = Integer.parseInt(privacy_date.split("\\.")[1]);
int privacy_day = Integer.parseInt(privacy_date.split("\\.")[2]);
for (String term : terms) {
String term_type = term.split(" ")[0];
int term_date = Integer.parseInt(term.split(" ")[1]);
if (privacies[i].contains(term_type)) {
privacy_month += term_date;
if (privacy_month > 12) {
privacy_year += privacy_month / 12;
privacy_month = privacy_month % 12;
}
if (privacy_day == 1) {
privacy_day = 28;
privacy_month--;
} else {
privacy_day--;
}
}
}
String e_privacy_year = Integer.toString(privacy_year);
String e_privacy_month = Integer.toString(privacy_month);
if (e_privacy_month.length() == 1) {
e_privacy_month = "0" + e_privacy_month;
}
String e_privacy_day = Integer.toString(privacy_day);
if (e_privacy_day.length() == 1) {
e_privacy_day = "0" + e_privacy_day;
}
expected_expired_date[i] = e_privacy_year + e_privacy_month + e_privacy_day;
}
for (int i = 0; i < expected_expired_date.length; i++) {
if (today_int > Integer.parseInt(expected_expired_date[i])) {
expired_cnt++;
}
}
int[] answer = new int[expired_cnt];
int idx = 0;
int idx2 = 1;
for (String eed : expected_expired_date) {
if (today_int > Integer.parseInt(eed)) {
answer[idx] = idx2;
idx++;
}
idx2++;
}
return answer;
}
}
이로써 프로그래머스 Lv.1 단계의 문제도 모두 풀었다..!
'Java > Programmers' 카테고리의 다른 글
[Lv.2]멀리 뛰기 (0) | 2023.02.06 |
---|---|
[Lv.2] N개의 최소공배수 (0) | 2023.02.05 |
[Lv.1]햄버거 만들기 (0) | 2023.02.01 |
[Lv.1]성격 유형 검사하기 (0) | 2023.02.01 |
[Lv.1]문자열 나누기 (0) | 2023.01.31 |
댓글