티스토리 뷰
📌문제
온라인으로 강의를 들으려 하는데 선수 강의가 있는 강의는 선수 강의를 먼저 들어야만 해당 강의를 들을 수 있다. 동빈이는 N개의 강의를 듣고자 한다. 모든 강의는 1~N번까지의 번호를 가진다. 또한 동시에 여러 강의를 들을 수 있다고 가정한다.
동빈이가 듣고자하는 N개의 강의 정보가 주어졌을 때 N개의 강의에 대해 수강하기까지 걸리는 최소 시간을 각각 출력하는 프로그램을 작성하시오
📌풀이
위상 정렬 알고리즘 사용
각 각의에 대해 인접 노드를 확인할 때 현재보다 강의 시간이 더 긴 경우를 찾는다면 더 오랜 시간이 걸리는 경우의 시간 값을 저장하는 방식으로 결과 테이블 갱신
리스트의 경우 단순 대입 연산을 하면 값이 변경될 대 문제가 발생할 수 있기 때문에 리스트 값을 복제해야 할 때는 deepcopy() 함수 사용
📌코드
from collections import deque
import copy
# 노드 개수 입력받기
v = int(input())
# 모든 노드에 대한 진입차수 0으로 초기화
indegree = [0] * (v + 1)
# 각 노드에 연결된 간선 정보 담기 위한 연결 리스트 초기화
graph = [[] for i in range(v + 1)]
# 각 강의 시간 0으로 초기화
time = [0] * (v + 1)
# 방향 그래프의 모든 간선 정보 입력
for i in range(1, v + 1):
data = list(map(int, input().split()))
time[i] = data[0] # 첫번째는 시간 정보
for x in data[1:-1]:
indegree[i] += 1
graph[x].append(i)
# 위상 정렬
def topology_sort():
result = copy.deepcopy(time)
q = deque()
# 처음 시작할 때는 진입 차수가 0인 노드를 큐에 삽입
for i in range(1, v + 1):
if indegree[i] == 0:
q.append(i)
# 큐가 빌때까지 반복
while q:
# 큐에서 원소 꺼낵
now = q.popleft()
# 해당 원소와 연결된 노드들의 진입차수 1 빼기
for i in graph[now]:
result[i] = max(result[i], result[now] + time[i])
indegree[i] -= 1
# 새롭게 진입차수 0 되는 노드 큐에 삽입
if indegree[i] == 0:
q.append(i)
for i in range(1, v + 1):
print(result[i])
topology_sort()
📌참고
이것이 취업을 위한 코딩 테스트다 with 파이썬
IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년
www.google.com