https://school.programmers.co.kr/learn/courses/30/lessons/150370
문제 접근
today : 오늘 날짜를 의미하는 문자열
terms : 약관의 유효기간을 담은 1차원 문자열 배열
privacies : 수집된 개인정보의 정보를 담은 1차원 문자열 배열
말이 구구절절 긴데 읽어보면 되게 뭐 없지만 푸는 건 구구절절하게 풀었다.
머릿속에 떠오르는 생각의 흐름대로 풀었는데 코드가 너무 길고 너저분하다.
import java.util.*;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
ArrayList<Integer> list = new ArrayList<Integer>();
String twoChar = "";
String threeChar = "";
HashMap<Character, Integer> termsType = new HashMap<Character, Integer>();
for(int i=0; i<terms.length; i++) {// 해쉬맵에 terms의 타입에 정보 저장기간을 저장
if(terms[i].length() == 3) { // 저장기간이 한 자릿수일 때
termsType.put(terms[i].charAt(0), Integer.valueOf(terms[i].charAt(terms[i].length()-1)) - '0');
}
else if(terms[i].length() == 4) { // 저장기간이 두 자릿수일 때
twoChar = String.valueOf(terms[i].charAt(terms[i].length()-2))
+ String.valueOf(terms[i].charAt(terms[i].length()-1));
termsType.put(terms[i].charAt(0), Integer.valueOf(twoChar));
}
else { // 저장기간이 세 자릿수일 때
threeChar = String.valueOf(terms[i].charAt(terms[i].length()-3))
+ String.valueOf(terms[i].charAt(terms[i].length()-2))
+ String.valueOf(terms[i].charAt(terms[i].length()-1));
termsType.put(terms[i].charAt(0), Integer.valueOf(threeChar));
}
}
for(int i=0; i<privacies.length; i++) { // privacies 날짜와 타입 쪼개기
String[] privaciesDate = privacies[i].split("[.]"); // split은 구분자로 .을 쓸려면 []안에 넣고 써야된다.
String[] privaciesDateEndPart = privaciesDate[2].split(" ");
char privaciesTermsType = privaciesDateEndPart[1].charAt(0); // privacies요소 마지막에 있는 알파벳 타입 저장
int year = Integer.valueOf(privaciesDate[0]);
int month = Integer.valueOf(privaciesDate[1]);
int day = Integer.valueOf(privaciesDateEndPart[0]);
String[] todayDate = today.split("[.]");
int todayYear = Integer.valueOf(todayDate[0]);
int todayMonth = Integer.valueOf(todayDate[1]);
int todayDay = Integer.valueOf(todayDate[2]);
System.out.println("오늘 날짜 : "+todayYear + " / " + todayMonth + " / " + todayDay);
for (Character key: termsType.keySet()){ // 해쉬 맵 키 사용, 모든 키와 값 비교 후 같으면 날짜 계산
if(privaciesTermsType == key) { // 같은 유형이면 날짜 계산해주고 오늘 날짜와 비교
month += termsType.get(key);
day -= 1;
if(month > 12) {
if(month % 12 != 0) {
int monthShare = month / 12;
int monthRest = month % 12;
year += monthShare;
month = monthRest;
}
else if(month % 12 == 0) {
int countTwelve = (month / 12)-1;
year += countTwelve;
month -= 12 * countTwelve;
}
}
if(day < 1) {
month -= 1;
day = 28;
}
System.out.println("보관 날짜 : "+ year + " / " + month + " / " + day);
int count = 0;
if(year < todayYear) count = i+1;
else if(year == todayYear && month < todayMonth) count = i+1;
else if(year == todayYear && month == todayMonth && day < todayDay) count = i+1;
if(count > 0) list.add(count);
}
}
}
int[] answer = list.stream().mapToInt(i -> i).toArray(); // Integer 리스트를 int 배열로 바꾸는 방법
// String은 그냥 list.toArryay() 쓰면 됨
return answer;
}
}
다른 사람 풀이
연 / 월 / 일의 달력의 형태가 아닌 연과 월을 다 일수로 만들어서 현재 날짜와 비교한게 인상적이다.
package chapter_01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList<>(); // 가변 크기의 List
Map<String, Integer> termMap = new HashMap<>();
int date = getDate(today); // 날짜를 연, 월, 일로 나누어주고 전부 일로 합산해서 int로 돌려주는 메서드
for (String s : terms) {
String[] term = s.split(" "); // 저장유형과 저장기간을 분리
termMap.put(term[0], Integer.parseInt(term[1])); // 저장유형에 저장기간 삽입
}
System.out.println(termMap);
for (int i = 0; i < privacies.length; i++) {
String[] privacy = privacies[i].split(" "); // 보관 시작날짜와 저장유형을 분리
if (getDate(privacy[0]) + (termMap.get(privacy[1]) * 28) <= date) { // 보관 시작날짜 총 일수 + 유형별 보관기간의 일수 <= 현재 날짜의 총 일수
answer.add(i + 1);
}
}
return answer.stream().mapToInt(integer -> integer).toArray(); // List를 배열로 변환
}
private int getDate(String today) {
String[] date = today.split("\\."); // .을 구분자로 쓰려면 [.] or \\. 사용
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; // year과 month를 전부 day와 똑같은 수치로 만들어주고 리턴
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 신고 결과 받기 / JAVA] (0) | 2023.02.16 |
---|---|
[프로그래머스 / 숫자 문자열과 영단어 / JAVA] (0) | 2023.02.13 |
[프로그래머스 / 둘만의 암호 / JAVA] (0) | 2023.02.07 |
[프로그래머스 / 최소직사각형 / JAVA / 완전탐색] (0) | 2023.02.03 |
[프로그래머스 / 성격 유형 검사하기 / JAVA] (0) | 2023.02.01 |
댓글