https://www.acmicpc.net/problem/2217
2217번: 로프
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하
www.acmicpc.net
🔷 알고리즘 분류 - 수학, 정렬, 그리디 알고리즘
난이도 - 실버 4
N개의 로프가 있고, 각 로프는 그 로프를 이용하여 물체를 들어 올릴 수 있는 최대 중량이 다르다는 것입니다.
로프를 병렬로 연결하면 각 로프에는 모두 동일한 중량이 걸리게 됩니다.
모든 로프를 사용할 필요는 없지만, 한 로프가 버틸 수 있는 최대 중량을 초과하면 그 로프는 찢어집니다.
각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어 올릴 수 있는 물체의 최대 중량을 구해야 합니다.
즉, 이 문제는 주어진 로프들을 이용하여 들어 올릴 수 있는 물체의 최대 중량을 구하는 것입니다.
로프를 모두 사용하지 않고, 일부만 사용하여 물체를 들어 올릴 수 있습니다.
하지만, 로프를 병렬로 연결하면 각 로프에 걸리는 중량은 모두 동일하므로, 가장 약한 로프를 기준으로 중량을 결정해야 합니다.
따라서 각 로프가 버틸 수 있는 중량을 내림차순으로 정렬한 후, 가장 약한 로프부터 시작하여 로프를 하나씩 추가하면서 최대 중량을 갱신하는 방식으로 문제를 해결할 수 있습니다.
이렇게 하면, 어떤 로프를 사용하더라도 그 로프가 버틸 수 있는 최대 중량을 초과하지 않으면서 물체의 최대 중량을 구할 수 있습니다.
🔶문제 풀이 - 그리디 알고리즘을 이용한 풀이
n=int(input()) # 사용자로부터 로프의 개수 n을 입력받습니다.
result=[]
for _ in range(n): # n번 반복합니다.
x=int(input()) # 사용자로부터 로프가 버틸 수 있는 중량 x를 입력받습니다.
result.append(x) # 로프가 버틸 수 있는 중량 x를 result 리스트에 추가합니다.
y=sorted(result,reverse=True) # result 리스트를 내림차순으로 정렬하고, 이를 y에 할당합니다.
result2=[] # 최대 중량을 저장할 result2 리스트를 초기화합니다.
for i in range(len(y)): # y의 길이만큼 반복합니다.
result2.append((i+1)*y[i]) # 로프를 사용하는 순서(i+1)와 중량 y[i]를 곱합니다.
print(max(result2)) # result2의 최대값을 출력합니다.
🔶문제 이해하기
예를 들어, 5개의 로프가 20kg, 15kg, 10kg, 25kg, 20kg라고 가정해 보겠습니다.
이 경우, 각 로프가 버틸 수 있는 중량을 내림차순으로 정렬하면 다음과 같이 됩니다
- 25kg, 20kg, 20kg, 15kg, 10kg
이제 가장 약한 로프부터 시작하여 로프를 하나씩 추가하면서 최대 중량을 계산해 봅니다.
로프 1개를 사용할 경우, 가장 버틸 수 있는 중량이 큰 25kg의 로프를 사용하면 최대 25kg를 들어 올릴 수 있습니다.
로프 2개를 사용할 경우, 각 로프가 버틸 수 있는 중량은 모두 동일하므로, 두 로프 중 가장 약한 로프인 20kg의 로프를 기준으로 하면 최대 40kg(=20kg*2)를 들어 올릴 수 있습니다.
로프 3개를 사용할 경우, 세 로프 중 가장 약한 로프인 20kg의 로프를 기준으로 하면 최대 60kg(=20kg*3)를 들어 올릴 수 있습니다.
로프 4개를 사용할 경우, 네 로프 중 가장 약한 로프인 15kg의 로프를 기준으로 하면 최대 60kg(=15kg*4)를 들어 올릴 수 있습니다.
로프 5개를 사용할 경우, 다섯 로프 중 가장 약한 로프인 10kg의 로프를 기준으로 하면 최대 50kg(=10kg*5)를 들어 올릴 수 있습니다.
따라서 이 경우, 로프 3개를 사용하여 60kg의 물체를 들어 올릴 수 있으며, 이것이 최대 중량이 됩니다.
'백준 알고리즘' 카테고리의 다른 글
백준 - 10810번 공 넣기 문제풀이 [Hellfer] (2) | 2024.01.05 |
---|---|
백준 - 14938번 서강드라운드 문제풀이 [Hellfer] (2) | 2023.12.30 |
백준 - 2458번 키 순서 문제풀이 [Hellfer] (2) | 2023.12.29 |
백준 - 1389번 케빈 베이컨의 6단계 법칙 문제풀이 [Hellfer] (0) | 2023.12.28 |
백준 - 5585번 거스름돈 python 문제풀이 [Hellfer] (0) | 2023.12.25 |
백준 - 10162번 전자레인지 python 문제풀이 [Hellfer] (0) | 2023.12.25 |
백준 - 17626번 Four Squares python 문제풀이 [Hellfer] (2) | 2023.12.23 |
백준 - 9461번 파도반 수열 python 문제풀이 [Hellfer] (2) | 2023.12.22 |