[백준] 작업 (2056번)
문제
수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다.
몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해 반드시 먼저 완료되어야 할 작업들이 있다. 이 작업들은 번호가 아주 예쁘게 매겨져 있어서, K번 작업에 대해 선행 관계에 있는(즉, K번 작업을 시작하기 전에 반드시 먼저 완료되어야 하는) 작업들의 번호는 모두 1 이상 (K-1) 이하이다. 작업들 중에는, 그것에 대해 선행 관계에 있는 작업이 하나도 없는 작업이 반드시 하나 이상 존재한다. (1번 작업이 항상 그러하다)
모든 작업을 완료하기 위해 필요한 최소 시간을 구하여라. 물론, 서로 선행 관계가 없는 작업들은 동시에 수행 가능하다.
입력
첫째 줄에 N이 주어진다.
두 번째 줄부터 N+1번째 줄까지 N개의 줄이 주어진다. 2번째 줄은 1번 작업, 3번째 줄은 2번 작업, ..., N+1번째 줄은 N번 작업을 각각 나타낸다. 각 줄의 처음에는, 해당 작업에 걸리는 시간이 먼저 주어지고, 그 다음에 그 작업에 대해 선행 관계에 있는 작업들의 개수(0 ≤ 개수 ≤ 100)가 주어진다. 그리고 선행 관계에 있는 작업들의 번호가 주어진다.
출력
첫째 줄에 모든 작업을 완료하기 위한 최소 시간을 출력한다.
예제 입력 1 복사
7 5 0 1 1 1 3 1 2 6 1 1 1 2 2 4 8 2 2 4 4 3 3 5 6
예제 출력 1 복사
23
작업의 선행 관계에 따라 작업의 순서를 조절해야 하는 문제였다.
크게 어려울 것 없고 앞의 작업부터 수행하면서 선행작업이 있을 때 선행작업 중에서 가장 늦게 끝나는 작업시간부터 현재 작업을 시작하면 된다.
예를들어 3번 작업이 1, 2번 작업을 선행 관계로 가지고 1번 작업이 10초, 2번 작업이 12초에 끝난다면 12초부터 3번 작업을 시작하면 된다는 뜻이다. 따라서 벡터를 통해 각 작업의 선행 작업을 저장한 후, 앞의 작업중에 가장 늦게끝나는 작업 시간을 가져오면 된다.
코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EC%9E%91%EC%97%85%20(2056%EB%B2%88).cpp
chosh95/STUDY
프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.
github.com
C++ 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
int cost[10001]; // i번째 작업의 작업 소요 시간
int t[10001]; // i번째 작업이 끝나는 시간 기록
vector<int> v[10001]; // i번째 작업의 선행 작업
int main()
{
cin >> N;
for (int cnt, i = 1; i <= N; i++) {
cin >> cost[i];
cin >> cnt; // i번째 작업의 선행 작업 개수
for (int tmp, j = 1; j <= cnt; j++) {
cin >> tmp;
v[i].push_back(tmp);
}
}
for (int i = 1; i <= N; i++) {
int cur = 0;
for (int j = 0; j < v[i].size(); j++) // 현재 작업의 선행 작업 중 가장 늦게 끝나는 작업 시간 구하기
cur = max(cur, t[v[i][j]]);
t[i] = cur + cost[i];
}
int res = 0; //결과 구하기
for (int i = 1; i <= N; i++)
res = max(res, t[i]);
cout << res;
}