처음 코드
n = int(input())
rope = [int(input()) for _ in range(n)]
print(min(rope) * n)
Python
복사
처음에 너무 쉽게 생각했다. 가장 적은 무게를 들 수 있는 로프 * 전체 로프 개수를 하면 최대 무게가 나온다고 생각했으나, 문제의 조건에 “모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.”라는 부분을 간과했다.
→ 각 로프가 들 수 있는 최대 무게 경우의 수를 모두 고려해보고 최대 무게를 결정해야한다.
수정 코드
n = int(input())
rope = [int(input()) for _ in range(n)]
rope.sort(reverse=True)
weight = [] # 로프별 들 수 있는 최대 무게를 구해야함.
for i in range(n):
weight.append(rope[i] * (i+1)) # ex) [100*1, 50*2, 30*3, 30*4, 10*5]
print(max(weight))
Python
복사
문제 해결 아이디어
가장 적은 무게를 들 수 있는 로프 * 전체 로프 개수 = 최종 무게 라는 공식 자체는 변함이 없으나, 가장 힘이 센 로프 > 가장 약한 로프*전체 무게의 경우를 고려해야한다.
예를 들어, [100, 20, 10]일 경우, 위의 공식대로라면 30이 최대 무게이지만, 사실은 100하나로도 100의 무게를 충분히 들 수 있다.
때문에 이를 내림차순 정렬해서 병렬 로프 개수를 곱해주며, 가장 큰 무게를 들 수 있는 로프가 무엇인지를 생각해야한다.