[1516번] 게임 개발하기 (위상정렬)

2023. 3. 13. 16:11·Coding Test/Graph
728x90
 

1516번: 게임 개발

첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부

www.acmicpc.net

 

위상정렬

  • 사이클이 없는 방향 그래프에서 노드 순서를 찾는 알고리즘
  • 항상 유일한 값으로 정렬되지 않음
  • ex) 롤 아이템, 수강신청

 

풀이

from collections import deque
"""
위상정렬 : 사이클이 없는 방향 그래프에서 노드 순서를 찾는 알고리즘

모든 건물을 짓는데 걸리는 최소 시간
여러 개의 건물을 동시에 지을 수 있음
N개의 건물을 지을 때 각 건물을 짓기 위해 필요한 최소 시간 출력

건물의 종류 수 n(1~500)
각 건물을 짓는 데 걸리느 시간(1~100.000)
건물을 짓기 위해 먼저 지어야 하는 건물들의 번호
각 줄은 -1로 끝남

5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1
"""

# 5
n = int(input())

# 인접 리스트
a = [[] for _ in range(n+1)]
# 진입 차수 리스트
dList = [0] * (n+1)
# 건물 짓는데 걸리는 시간
bList = [0] * (n+1)

# for 건물갯수
for i in range(1, n+1):
    arr = list(map(int, input().split()))
    # 건물 시간 저장
    bList[i] = arr[0]

    j = 1
    while True:
        if arr[j] == -1:
            break
        # 인접 리스트 데이터 저장
        a[arr[j]].append(i)
        # 진입 차수 리스트 추가
        dList[i] += 1
        j += 1

# 정답리스트
rList = [0] * (n+1)

queue = deque()

# dList [0, 0, 1, 1, 2, 1]
for i in range(1, n+1):
    if dList[i] == 0:
        queue.append(i)

while queue:
    node = queue.popleft()

    for i in a[node]:
        dList[i] -= 1

        # 시간 업데이트
        # rList[i] = rList[node] + bList[node] 오답
        rList[i] = max(rList[i], rList[node] + bList[node]) # 수정

        if dList[i] == 0:
            queue.append(i)

# print(rList)
for i in range(1, n+1):
    print(rList[i]+bList[i])

 

시간 업데이트

특정 i가 여러번 갱신될 수 있는데, 일전에 계산된 값보다 현재 값이 작은 경우가 존재할 수 있음

 

# 시간 업데이트
rList[i] = max(rList[i], rList[node] + bList[node])

반례 입력

10 -1
20 1 -1
30 2 -1
40 3 5 -1
100 -1

 

큐 1 5 2 3 4

node 5에서 rList[4] = 100 

node 3에서 rList[4] = 60

max값으로 구하지 않으면 60으로 update됨

 

 

더보기
 

[Swift] BOJ 1516 게임 개발

BOJ 1516 게임 개발 ✅ 이 문제는 위상 정렬 문제인데 시간을 계산해야 해서 알고리즘이 약간 복잡했다. 근데 풀다가 못풀 것 같았는데 맞았을 때의 희열감이란,, ㅎ 🟠 문제풀이 플로우 우선 input

rldd.tistory.com

728x90
'Coding Test/Graph' 카테고리의 다른 글
  • [11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)
  • [1854번] k번째 최단경로 구하기
  • [1753번] 최단경로 구하기 (다익스트라, 우선순위큐, 힙)
  • [1717번] 집합의 표현 (유니온 파인드)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    트리
    자료구조
    백준
    최대공약수
    알고리즘
    재귀
    다익스트라
    구현
    BFS
    힙
    최소신장트리
    덱
    그리디
    월간코드챌린지
    DFS
    구간합
    큐
    조합
    DP
    LIS
    스택
    정렬
    Algorithm
    그래프
    이분탐색
    파이썬
    플로이드워셜
    최단거리
    동적계획법
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[1516번] 게임 개발하기 (위상정렬)
상단으로

티스토리툴바