문제 링크 : www.acmicpc.net/problem/2217

 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

처음에 나타난 최대 중량을 구하는 방법을 찾는데 시간이 조금 걸렸다. 로프가 버틸 수 있는 최대 중량은 (선택한 로프들의 버틸 수 있는 중량 중 최솟값) x (선택한 로프의 개수)이다. 따라서 예제를 살펴보면 로프가 2개가 있고, 버틸 수 있는 중량이 10, 15이다. 여기서 로프를 모두 사용할 필요는 없으므로 가능한 경우의 수는 2가지이다.

① 버틸 수 있는 중량이 15인 로프만 사용 ==>  버틸 수 있는 중량 = 15 x 1 = 15

② 버틸 수 있는 중량이 10인 로프만 사용 ==> 버틸 수 있는 중량 = 10 x 1 = 10

③ 두 개의 로프를 모두 사용 ==> 버틸 수 있는 중량 = 10 x 2 = 20

따라서 버틸 수 있는 최대 중량은 20이다.

이를 통해 생각한 문제풀이 방법은 다음과 같다.

① 중량들을 내림차순으로 정렬하고, 최대 중량을 첫 번째 원소의 값으로 초기화

② 다음 로프가 추가되었을 때의 중량이 최대 중량보다 크면 최대 중량을 갱신

import sys

N = int(sys.stdin.readline())
ropes = []
for _ in range(N):
    rope = int(sys.stdin.readline())
    ropes.append(rope)

ropes.sort(reverse=True)

weight = 0
max_weight = ropes[0]
for i, rope in enumerate(ropes):
    weight = rope * (i+1)

    if weight > max_weight:
        max_weight = weight

print(max_weight)

제출 후 다른 분들의 코드를 살펴보았는데 리스트 표현식, max()함수 등을 이용하여 소스코드를 간결하게 작성이 가능했다. 따라서 간결한 버전의 소스코드는 다음과 같다.

import sys

N = int(sys.stdin.readline())
ropes = [int(sys.stdin.readline()) for _ in range(N)]

ropes.sort(reverse=True)

weight = 0
max_weight = ropes[0]
for i, rope in enumerate(ropes):
    max_weight = max(max_weight, rope*(i+1))
    
print(max_weight)

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1449번 - 수리공 항승  (0) 2021.01.03
[백준] 4796번 - 캠핑  (0) 2021.01.03
[백준] 1932번 - 정수 삼각형  (0) 2021.01.02
[백준] 9461번 - 파도반 수열  (0) 2021.01.02
[백준] 1541번 - 잃어버린 괄호  (0) 2020.12.29

+ Recent posts