티스토리 뷰

코딩테스트

커리큘럼

ajaa 2024. 11. 15. 12:50

📌문제

온라인으로 강의를 들으려 하는데 선수 강의가 있는 강의는 선수 강의를 먼저 들어야만 해당 강의를 들을 수 있다. 동빈이는 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()

 

 

📌참고

https://g.co/kgs/eyd5SSd

 

이것이 취업을 위한 코딩 테스트다 with 파이썬

IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년

www.google.com

 

 

'코딩테스트' 카테고리의 다른 글

곱하기 혹은 더하기  (0) 2024.11.18
모험가 길드  (6) 2024.11.16
도시 분할 계획  (1) 2024.11.14
팀 결성  (1) 2024.11.13
위상 정렬  (1) 2024.11.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함