Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- deque
- DP
- 알고리즘
- BOJ
- Bitmasking
- 비트연산
- 딕셔너리
- 너비우선탐색
- 에라토스테네스의 체
- 비트마스킹
- Python
- 이진 탐색
- CCW알고리즘
- binary search
- dijkstra algorithm
- 백준
- 재귀
- Algorithm
- 다익스트라
- 위상정렬
- 외적
- ccw
- Two Pointers
- 소수
- CCW 알고리즘
- BFS
- recursion
- 큐
- 투 포인터
- 에라토스테네스
Archives
- Today
- Total
꾸꾸리
[BOJ/Python] 16169_수행 시간 본문
728x90
문제 출처:https://www.acmicpc.net/problem/16169
16169번: 수행 시간
첫 번째 줄에는 컴퓨터의 개수 n이 주어진다. (3 ≤ n ≤ 100) 두 번째 줄부터 n개의 줄에 걸쳐 1번부터 n번까지 각 컴퓨터의 계급과 동작 속도 t가 공백을 두고 주어진다. (1 ≤ t ≤ 100)
www.acmicpc.net
문제
특정 임무를 수행하기 위해 n개의 컴퓨터로 이루어진 시스템이 있다고 하자. 이 시스템의 동작 체계는 아래와 같다.
- 모든 컴퓨터는 1번부터 n번까지 번호가 매겨져 있다. 모든 컴퓨터는 각자의 계급과 동작 속도를 가지고 있다. 또한 계급과 동작 속도는 모두 양의 정수이다.
- i번 컴퓨터와 j번 컴퓨터 간의 전송 시간은 (i - j)^2이다.
- 각 n개의 컴퓨터의 계급은 c1, c2, … cn이다. (1 ≤ c1 ≤ c2 ≤ … ≤ cn ≤ n). 주어진 컴퓨터의 계급을 오름차순으로 정렬했을 경우, | cj -cj-1 |≤ 1이다.
- 제일 낮은 계급의 컴퓨터를 제외한 모든 컴퓨터들은 자신보다 한 단계 낮은 계급의 모든 컴퓨터에게 정보를 전달받아야만 동작을 시작 할 수 있다. 이 때, 동작을 시작하기 위해서는 그 컴퓨터의 동작 속도만큼의 시간이 소요된다.
- 제일 낮은 계급의 컴퓨터는 전달 받을 정보가 없다. 따라서 시스템 시동과 동시에 동작한다.
- 계급이 c인 컴퓨터가 동작을 마치면 c+1의 계급을 가진 모든 컴퓨터에 정보를 전달 후 종료된다.
- 모든 컴퓨터가 동작을 마치고 종료되면 이 시스템의 임무 수행이 끝난다.
- 가장 낮은 계급은 1이다.
이 시스템에 대한 정보가 주어졌을 때 임무 수행이 끝날 때까지 걸린 시간을 구하여라.
입력
첫 번째 줄에는 컴퓨터의 개수 n이 주어진다. (3 ≤ n ≤ 100) 두 번째 줄부터 n개의 줄에 걸쳐 1번부터 n번까지 각 컴퓨터의 계급과 동작 속도 t가 공백을 두고 주어진다. (1 ≤ t ≤ 100)
출력
문제의 정답을 출력하라.
예제 입력 1
9
1 1
3 9
3 1
4 2
4 2
2 5
1 30
4 2
5 3
예제 출력 1
103
풀이
- 각 계급에서의 컴퓨터들은 동작을 마치고, 다음 단계의 컴퓨터들에게 정보를 전달한다.
- 여기서 컴퓨터들이 동작하는데 드는 시간은 각 컴퓨터마다의 동작 속도 t이다.
- 다음 단계의 컴퓨터들에게 정보를 전달하는데 드는 시간은 컴퓨터의 번호에 따라 다른데, i번 컴퓨터와 j번 컴퓨터 간의 전송의 경우 (i - j)^2 만큼의 시간이 걸린다.
- 최종적으로 1단계에 있는 컴퓨터들부터 동작하여, 최종적으로 모든 컴퓨터들이 동작을 마쳤을 때 걸리는 시간을 출력하는 문제이다.
우선 코드는 다음과 같다.
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
|
import sys
def solve():
for i in ranks[1]:
total_time[i] = times[i]
for i in range(1,n):
for node in ranks[i]:
for next in ranks[i+1]:
total_time[next] = max(total_time[next],(next-node)**2 + total_time[node] + times[next])
n = int(sys.stdin.readline())
total_time = [0 for _ in range(n+1)]
times = [0]
ranks = [[] for _ in range(n+1)]
for i in range(1,n+1):
rank,t = map(int,sys.stdin.readline().split())
ranks[rank].append(i)
times.append(t)
solve()
print(max(total_time))
|
cs |
- ranks의 경우, 각 계급에 존재하는 컴퓨터의 번호를 저장한다. ranks [1]의 경우, 계급이 1인 컴퓨터의 번호들이 저장된다.
- times의 경우, 각 컴퓨터들마다 동작하는 데 드는 동작시간 t의 정보가 저장된다. times [2]의 경우, 2번 컴퓨터의 동작시간이다.
- total_time은 해당 컴퓨터를 수행하는데 드는 총 소요시간이다.
- solve() 함수의 경우, 우선 계급이 1인 컴퓨터는 시스템의 시동과 동시에 시작되므로, 동작시간 t가 곧 해당 컴퓨터의 총 소요시간이다.
- 계급이 2 이상인 경우, 아래 계급이 동작한 이후에 동작한다.
- (next-node)**2 의 경우, node 번 컴퓨터와 next 번 컴퓨터의 전송시간이다.
- total_time [node]는 node 번 컴퓨터까지의 총 소요시간이고, times [next]는 next 번 컴퓨터의 동작시간이다.
- 따라서, (현재 컴퓨터까지의 총 소요시간 + 전송시간 + 다음 컴퓨터의 동작시간)을 나타내고, 이 값이 다음 컴퓨터의 총 소요시간보다 크다면 바꾸어준다.
- 최종적으로 제일 오래 걸리는 시간을 출력한다.
728x90
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ/Python] 25187_고인물이 싫어요 (0) | 2023.04.02 |
---|---|
[BOJ/Python] 9694_무엇을 아느냐가 아니라 누구를 아느냐가 문제다 (0) | 2023.03.31 |
[BOJ/Python] 17250_은하철도 (0) | 2023.03.29 |
[BOJ/Python] 15809_전국시대 (0) | 2023.03.28 |
[BOJ/Python] 22116_창영이와 퇴근 (0) | 2023.03.27 |