본문 바로가기

알고리즘/백준

[백준] 2056번 : 작업

728x90

2056번: 작업

 

2056번: 작업

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해

www.acmicpc.net

🤔 문제분석

위상정렬을 알고 있다면 해당문제를 쉽게 풀 수 있다. 위상정렬을 간단하게 설명하자면, 진입차수를 입력받아 진입차수가 0일때만 방문하도록한다. 여기서 방문할때에 기존에 걸렸던 시간중 가장 큰 시간을 가져와서 가중치에 더하면 된다.

문제에서 선행관계에 있는 작업이 하나도 없는 작업이 하나 이상 존재함으로 처음 루트를 방문 할때에 진입차수가 0인 루트가 여러개가 있다는 말임으로, 초기 진입차수가 0인 루트를 찾아서 모두 방문 해주어야한다.

💻 코드

import sys
input = sys.stdin.readline

N = int(input())
in_degree = [0 for _ in range(N)]
edge = [[] for _ in range(N)]
time = [0 for _ in range(N)]
dp = [-1 for _ in range(N)]

def dfs(node):
    for child in edge[node]:
        in_degree[child] -= 1
        dp[child] = max(dp[child], dp[node]+time[child])
        if in_degree[child] <= 0:
            dfs(child)
            
def get_roots():
    roots = []
    for n in range(N):
        if in_degree[n] == 0:
            roots.append(n)
            
    return roots

for i in range(N):
    temp = list(map(int, input().split()))
    time[i] = temp[0]
    in_degree[i] = temp[1]
    if temp[1]:
        for n in temp[2:]:
            edge[n-1].append(i)

roots = get_roots()
for root in roots:
    dp[root] = time[root]
    dfs(root)

print(max(dp))

🎯 피드백 및 개선사항

위상정렬의 내용을 알고 있다면 문제를 쉽게 풀 수 있을 것이라고 생각됩니다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 17143번 : 낚시왕  (1) 2024.01.30
[백준] 1509번 : 펠린드롬 분할  (2) 2024.01.28
[백준] 2169번 : 로봇 조종하기  (1) 2024.01.24
[백준] 15486번 : 퇴사 2  (1) 2024.01.24
[백준] 13398번 : 연속합 2  (1) 2024.01.22