Algorithm & Problem Solving/그리디 알고리즘(Greedy)

[백준 1263] 시간 관리 (Python)

baby_ohgu 2021. 1. 30. 00:37

www.acmicpc.net/problem/1263

 

1263번: 시간 관리

첫째 줄에 일의 수 N이 입력되고 다음 N(1≤N≤1,000)개의 줄에 대해 i+1번째 줄에는 i번째 일에 대한 Ti(1≤Ti≤1,000)와 Si(1≤Si≤1,000,000)가 입력된다.

www.acmicpc.net

 

문제풀이

N : 입력값

arr : i번째 작업의 (완료시간, 작업이 걸리는 시간)

 

작업의 완료 시간을 기준으로 가장 늦게 완료해도 되는 작업부터 시작해서 다른 일들의 작업 시간을 탐색하면서 시작 시간을 갱신하는 그리디 알고리즘으로 해결할 수 있다.

 

1. 작업의 완료 시간을 기준으로 역순으로 정렬하기

 

2. 첫 번째 작업의 최대 시작 시간을 시작으로 나머지 작업들 확인하기

- i번째 일을 끝마쳐야 하는 시간이 현재 시간보다 앞선다 => i번째 일을 시작할 수 있는 가장 늦은 시간으로 시작 시간 갱신

- i번째 일을 끝마쳐야 하는 시간이 현재 시간보다 앞서지 않는다 => 현재 시간에서 i번째 일의 작업 시간만큼 감소

 

코드

import sys

if __name__ == '__main__':
    N = int(input())
    arr = []
    for _ in range(N):
        a, b = map(int, sys.stdin.readline().split())
        arr.append((b, a))
    # 가장 늦은 시간에 해결해도 되는 일 순으로 역순 정렬
    arr.sort(reverse=True)
    ans = arr[0][0] - arr[0][1]
    for i in range(1, N):
        # i번째 일을 끝마쳐야 하는 시간이 현재 시간보다 앞선다면
        # 시작 시간 갱신 : i번째 일을 시작할 수 있는 가장 늦은 시간
        if ans > arr[i][0]:
            ans = arr[i][0] - arr[i][1]
        # i번째 일을 끝마쳐야 하는 시간이 현재 시간보다 앞서지 않는다면
        # 시작 시간 갱신 : i번쨰 일을 완료하는데 걸리는 시간만큼 현재 시간에서 감소
        else:
            ans -= arr[i][1]
    print(ans if ans >= 0 else -1)

 

 

결과

 

 

문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!