2056. 작업
2056번: 작업
수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해
www.acmicpc.net
- 4%에서 계속 틀려서 되게 애먹은 문제...
- 전입차수가 없거나 동일한게 여러개 있다는 것 잊지말기!
- 시작도 여러개, 끝도 여러개가 동시에 될 수 있음!!
- 틀린 이유
-
- 전입차수가 0인게 1만 있는건 아니므로 전체 돌면서 queue에 넣어줘야 0인값들이 먼저 시작됨.
- 전부 전입차수가 없을 수 있고,
마지막 순서값도 하나가 아닐 수 있기때문에 solve문 안에서 if절로 return할수 없음- → 나와서 max(visited)로 확인
- 현재값의 시간까지 더해서 비교하지 말고, 전입값들 크기로만 비교해서 다음값 (visited[gp]) 갱신해두기
- → 그래야 시간단축
- 전입차수 개수가 0이 되면 그때 현재값까지 더해서 저장
#사용했던 반례
7
5 0
3 0
6 0
1 0
8 0
4 0
2 0
#결과
8
- 내 풀이
from collections import deque
def solve():
global n
global result
queue = deque()
#전입차수가 0인게 1만 있는건 아니므로 전체 돌면서 queue에 넣어주기
for i in range(1,n+1):
if inlst[i]==0:
visited[i]=time[i]
queue.append(i)
while queue:
k= queue.popleft()
for gp in graph[k]:
if inlst[gp]!=0:
inlst[gp] -= 1
#전입값들을 현재값에 넣으면서 계속 갱신
visited[gp]=max(visited[gp],visited[k])
if inlst[gp] == 0:
#위에서 전입값
visited[gp]+=time[gp]
queue.append(gp)
n = int(input())
# 진입차수 개수
inlst = [0 for i in range(n + 1)]
time = [0 for i in range(n + 1)]
graph = [[] for i in range(n + 1)]
visited=[0 for i in range(n+1)]
for i in range(1, n + 1):
# 걸린 시간, 선행작업 개수, 작업 번호
tmp = list(map(int, input().split()))
time[i] = tmp[0]
inlst[i] = tmp[1]
for l in tmp[2:]:
graph[l].append(i)
solve()
#전부 전입차수가 없을 수 있고
#마지막 순서값도 하나가 아닐 수 있기때문에 solve문 안에서 if절로 return할수 없음
print(max(visited))
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준][구현] 1913. 달팽이 (0) | 2023.04.19 |
|---|---|
| [백준] [BFS][위상정렬] 14567. 선수과목 (0) | 2023.04.18 |
| [백준] [BFS] 9019. DSLR (0) | 2023.04.15 |
| [백준][BFS] 9934. 완전 이진 트리 (0) | 2023.04.14 |
| [백준] [DFS] [백트래킹] 13023. ABCDE (0) | 2023.04.14 |