[Baekjoon] 1263 시간 관리
https://www.acmicpc.net/problem/1263
import sys
input = sys.stdin.readline
n = int(input());
time = [list(map(int, input().split())) for _ in range(n)]
time.sort(key = lambda x:-x[1])
result = time[0][1]-time[0][0]
for i in range(1,n):
if result>=time[i][1]: result = time[i][1]-time[i][0]
else: result-=time[i][0]
print(result if result>=0 else -1)
point 1 : 이른 시간부터 vs 늦은 시간부터
n개의 일에 대해 걸리는 시간과, 각 일을 끝내야 하는 시간이 주어질 때, 처음 해결할 일과 마지막에 해결할 일 중 어떤 일을 기준으로 연산을 시작할 지 최우선으로 고민하였다.
case 1 : 처음 해결할 일을 먼저 고려
모든 일을 해결하는 데 걸리는 시간을 구한 후, 24에서 구한 값을 빼면 그 시간이 진영이가 일을 시작해야하는 시간이 된다. 이 때 값이 음수라면 -1을 출력한다.
case 2 : 마지막에 해결할 일을 먼저 고려
각 일의 마감 시간은 S이고, 처리하는 데 걸리는 시간은 T이므로, 모든 일에 대해 S-T를 진행하면 해당 일을 시작해야 하는 시간을 얻을 수 있다. 일을 시작해야 하는 시간과 앞선 일이 끝나야 하는 시간을 비교하여 상황에 맞게 일어나는 시간을 조정한다.
soltion
case2를 채택하였다. 처음 해결할 일을 우선적으로 고려하는 경우보다 해야할 연산이 간단하고, 모든 연산이 끝나면 추가적으로 연산을 할 필요 없이 (처음 해결할 일을 우선적으로 고려하면 24에서 시간을 빼줘야 함) 결과를 도출할 수 있기 때문이다.
result 변수는 각 일이 시작되어야 하는 시간을 저장하는 변수이다. 마감 시간이 늦은 일 순서대로 리스트를 정렬한 후, 인덱스 i인 일의 S-T의 값이 인덱스 i+1의 S보다 크다면, result에 i+1의 S-T를 저장한다. (i+1의 일이 끝나야하는 시간보다 i의 일이 시작되는 시간이 늦으므로) 그렇지 않을 경우에는, i일이 시작되는 시간에 i+1의 일이 끝나는 것으로 간주하여, result에서 i+1의 T를 빼준다. 모든 일에 대하여 해당 작업을 반복한 후, result가 음수라면 -1, 양수라면 변수값을 출력한다.