이 문제를 처음 봤을 때 핵심 상황은 다음과 같이 정리할 수 있었습니다.
이를 코드로 표현하기 위해 다음과 같이 상태를 나눴습니다.
cur // 현재 진행 중인 과제
tmp_stop // 중단된 과제
answer // 완료된 과제
특히 tmp_stop에서 push()와 pop()을 사용한 것은 올바른 판단이었습니다. 중단된 과제를 최근에 멈춘 순서대로 다시 시작해야 하므로 이 문제는 스택의 LIFO 구조와 정확히 일치합니다.
처음에는 현재 과제가 다음 과제 시작 전에 끝나는지만 판단했습니다.
if (p_stime >= c_stime + c_ptime) {
answer.push(c_lang);
}
하지만 현재 과제가 일찍 끝났다면 다음 과제 시작까지 시간이 남습니다. 이 남은 시간 동안 tmp_stop에 들어 있는 중단 과제를 다시 진행해야 합니다.
즉, 단순히 다음 두 경우만 있는 것이 아니었습니다.
현재 과제 완료
현재 과제 중단
실제로는 현재 과제가 완료되는 경우를 다시 나눠야 했습니다.
현재 과제 완료
├─ 남는 시간 없음
└─ 남는 시간 있음
└─ 중단된 과제를 최근 순서대로 다시 수행
이를 해결하기 위해 다음 값을 만들었습니다.