728x90
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/150370
생각
1. terms를 맵으로 변환한다.
2. privacies 를 순회하며 해당 일자의 파기일자를 구한다.
3. 파괴해야한다면 큐에 넣기
코드
- 힌트를 좀 봤다.
- 28일로 고정되어있는게 힌트고 자칫 함정에 빠질 수 있는 문제였다. (
이미 함정에 빠졌었다.) - 년을 먼저 구한다. -> 더해서 12월이 되는경우 년도를 더하면 안된다.
월을 구할 때 -1 해야 한다 등 어처구니 없는 행위들을 생각하느라 시간을 많이 쏟았다.
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
System.out.println(solution("2022.05.19",new String[]{"A 6", "B 12", "C 3"},new String[]{"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"}));
System.out.println(solution("2020.01.01",new String[]{"Z 3", "D 5"},new String[]{"2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"}));
}
public static int[] solution(String today, String[] terms, String[] privacies) {
int[] answer = {};
String[] split = today.split("\\.");
Integer today_year = Integer.valueOf(split[0]);
Integer today_month = Integer.valueOf(split[1]);
Integer today_day = Integer.valueOf(split[2]);
int today_total = 12*28*today_year + 28*today_month + today_day;
// 1. terms를 맵으로 변환한다.
HashMap<String, Integer> terms_map = new HashMap<>();
for (int i = 0; i < terms.length; i++) {
terms_map.put(terms[i].split(" ")[0], 28*Integer.valueOf(terms[i].split(" ")[1]));
}
Queue<Integer> queue = new LinkedList<>();
// 2. privacies 를 순회하며 해당 일자의 파기일자를 구한다.
for (int i = 0; i < privacies.length; i++) {
String suZipIl = privacies[i].split(" ")[0];
String yakGwan = privacies[i].split(" ")[1];
int paGiIl = getPaGiIl(suZipIl,yakGwan,terms_map);
// 3. 하루 빼는 대신 ==도 포함시키기 큐에 넣기
if(today_total >= paGiIl){
queue.add(i);
}
}
answer = new int[queue.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = queue.poll()+1;
}
for (int i = 0; i < answer.length; i++) {
System.out.print(answer[i] + " ");
}
return answer;
}
// suZipIl : 2024.05.11
// yakGwan : A
// suZip_month : 5
// manRowIl_Month : 100
private static int getPaGiIl(String suZipIl, String yakGwan, HashMap<String, Integer> termsMap) {
Integer manRowIl_Month = termsMap.get(yakGwan);
String[] split = suZipIl.split("\\.");
Integer suZip_year = Integer.valueOf(split[0]);
Integer suZip_month = Integer.valueOf(split[1]);
Integer suZip_day = Integer.valueOf(split[2]);
int suZip_total = 12*28*suZip_year + 28*suZip_month + suZip_day;
return suZip_total + manRowIl_Month;
}
}
다른 사람 코드
- 두가지 코드가 매력적이라 두 코드를 다 가져왔다.
- 첫번째는 28일이 같다는 아이디어를 이용한 것이고
- 두번째는 날짜 함수를 이용한 것이다.
public class Main {
public static void main(String[] args) {
System.out.println(solution("2022.05.19",new String[]{"A 6", "B 12", "C 3"},new String[]{"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"}));
System.out.println(solution("2020.01.01",new String[]{"Z 3", "D 5"},new String[]{"2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"}));
}
public static int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> termMap = new HashMap<>();
int date = getDate(today);
for (String s : terms) {
String[] term = s.split(" ");
termMap.put(term[0], Integer.parseInt(term[1]));
}
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();
}
private static 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;
}
}
- 두번째 코드
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class Main {
public static void main(String[] args) {
System.out.println(solution("2022.05.19",new String[]{"A 6", "B 12", "C 3"},new String[]{"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"}));
System.out.println(solution("2020.01.01",new String[]{"Z 3", "D 5"},new String[]{"2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"}));
}
public static int[] solution(String today, String[] terms, String[] privacies) {
List<Integer> answer = new ArrayList();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
LocalDate date = LocalDate.parse(today, formatter);
// 찾기 쉽도록 termsMap 구성
Map<String, Integer> termsMap = new HashMap<>();
for (int i = 0; i < terms.length; i++) {
String[] term = terms[i].split(" ");
termsMap.put(term[0], Integer.valueOf(term[1]));
}
for (int i = 0; i < privacies.length; i++) {
String[] privacy = privacies[i].split(" ");
LocalDate privacyRegisterYmdt = LocalDate.parse(privacy[0], formatter).plusMonths(termsMap.get(privacy[1])).minusDays(1);
if (privacyRegisterYmdt.isBefore(date)) {
answer.add(i + 1);
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
728x90
반응형
'Dev > Algorithm' 카테고리의 다른 글
[프로그래머스] 데이터 분석 (0) | 2024.05.18 |
---|---|
[프로그래머스] 이웃한 칸 (0) | 2024.05.18 |
[프로그래머스] 가장 많이 받은 선물 (2) | 2024.05.17 |
[프로그래머스] 붕대 감기 (0) | 2024.05.17 |
75. [TIL] 오늘의 배움일지 ( 21-09-17 ) (0) | 2021.09.17 |