티스토리 뷰

Problem Solving/BOJ

[BOJ 1005] ACM Craft C++

유자애옹 2021. 7. 16. 23:39

 

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부

www.acmicpc.net

 

 

문제풀이

 

이 게임은 건설 순서 규칙에 따라서 건물을 건설해야 한다.

 

위의 예시를 보자.

1번 건물의 건설이 완료된다면 2번과 3번의 건설을 동시에 진행할 수 있다.

그리고 4번 건물을 짓기 위해서는 2번과 3번 건물이 모두 건설 완료되어야지만 4번 건물의 건설을 시작할 수 있다.

따라서 4번 건물의 건설을 완료하기 위해서는 10초 + 100초 + 10초 = 120초가 소요된다.

120초가 4번 건물을 가장 빨리 지을 때까지 걸리는 최소시간인 것이다.

 

건물 W를 건설완료 하는데 드는 최소 시간을 찾기 위해서 위상 정렬을 해준다.

 

2번 건물을 완성하기 위해서는 1번 건물을 건설 완료해야하므로 총 11초가 걸린다.

3번 건물을 완성하기 위해서는 1번 건물을 건설 완료해야하므로 총 110초가 걸린다.

이 시간을 위상 정렬 시에 DP 배열에 저장해준다.

 

dp[i] = i번 건물을 건설 완료하는데 드는 최소 시간

최소 시간을 찾는 것이지만 선행 건물들이 모두 건설완료가 되어야하므로 최댓값을 찾는 것이다.

 

처음에 선행 정점을 가지지 않는 정점을 큐에 삽입할 때는 dp[i] = t[i]로 초기화해준다.

그리고 나서 다음 순서를 진행할 때 앞순서 건물 건설시간 + 현재 건물 건설시간 이 최대인 것을 저장해주면 해당 건물을 건설완료 하는데 드는 최소 시간을 구할 수 있다.

 

 

C++ 코드

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 2696] 중앙값 구하기 C++  (0) 2021.07.20
[BOJ 2900] 프로그램 C++  (0) 2021.07.19
[BOJ 1516] 게임 개발 C++  (0) 2021.07.16
[BOJ 3020] 개똥벌레 C++  (0) 2021.07.16
[BOJ 1205] 등수 구하기 C++  (0) 2021.07.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함