문제
https://school.programmers.co.kr/learn/courses/30/lessons/176962
풀이 시간 : 대략 180분..
시도 횟수 : 3
복기
문제만 꼼꼼히 읽으면, 쉽게 풀 수 있는 단 순 구현 문제 였다. 만, 구현하는데 오랜 시간이 걸렸다.
1. 시계열 데이터를 다루는데 오래 걸렸다. 다음에는 좀 더 빠륵 ㅔ풀자
1.1 정렬의 어려움 String으로 LocalTime 으로 만들고 Comparator 로 정렬하고 그랬는데, 그냥 Comparator 로 시계열을 정렬할 수 있었다.
1.2. Stirng으로 parsing해서 LocalTime을 만들었는데, DateTimeFormaater 로 쉽게 LocalTtime으로 만들 수 있었음.
1.3 두 시간사이의 차이를 계산하는 방법이 기억나지 않았음 Duration between toMinutes로 구할 수 있었다.
2. Queue, Stack 사용법을 익히는데도 시간을 썼다. 이부분은 양쪽모두 활용가능한 Dequeue로 앞으로 풀자.
3. 머리로 생각만하고 구현했는데, 복잡했고 충분히 구현이 되지 않아 1차 실패하였다. 로직을 종이에 정리하고 하자.
4. 2차 시도 실패원인은 문제에 2군데 놓친 부분이 있어 실패하였다. "가장 최근에 멈춘것 부터 실행", "남은 시간 처리" 사소한 실수는 계속 줄여야 한다.
import java.util.*;
import java.time.*;
import java.time.format.*;
class Solution {
public String[] solution(String[][] plans) {
int index = 0;
int N = plans.length;
String[] answer = new String[N];
Arrays.sort(plans, Comparator.comparing(a -> a[1]));
Deque<Schedule> wait = new LinkedList<>();
DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");
Integer remainingTime = 0;
for(int i = 1 ; i < N ; i++) {
String prvName = plans[i-1][0];
LocalTime prvTime = LocalTime.parse(plans[i-1][1], format);
Integer prvPlayTime = Integer.parseInt(plans[i-1][2]);
LocalTime curTime = LocalTime.parse(plans[i][1], format);
Duration duration = Duration.between(prvTime, curTime);
Integer diffMin = (int)duration.toMinutes();
if (prvPlayTime <= diffMin) {
answer[index++] = prvName;
remainingTime = diffMin - prvPlayTime;
while (!wait.isEmpty() && remainingTime - wait.peekLast().time >= 0) {
Schedule schedule = wait.pollLast();
remainingTime -= schedule.time;
answer[index++] = schedule.name;
}
// 남은시간을 처리해주지 않아 2번째 시도 때 83 점 받음
if(wait.peekLast() != null && remainingTime != 0){
wait.peekLast().time -= remainingTime;
}
} else {
wait.addLast(new Schedule(prvName, prvPlayTime - diffMin));
}
}
answer[index++] = plans[N-1][0];
while (!wait.isEmpty()){
answer[index++] = wait.pollLast().name;
}
return answer;
}
class Schedule {
String name;
Integer time;
public Schedule(String name, Integer time) {
this.name = name;
this.time = time;
}
}
}
더 나은 풀이방법
'알고리즘' 카테고리의 다른 글
Softeer Lv3 - 함께하는 효도 (0) | 2024.02.11 |
---|---|
프로그래머스 Lv2 - 광물 캐기 (1) | 2024.02.11 |
프로그래머스 Lv2 - 요격 시스템 (0) | 2024.02.06 |
프로그래머스 Lv2 - 도넛과 막대그래프 (1) | 2024.02.02 |
프로그래머스 Lv1 - 가장 많이 받은 선물 (0) | 2024.01.30 |