반응형

안녕하세요, 츄르 사려고 코딩하는 집사!      코집사입니다.

 

1. 문제

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

하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.

각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다. 단, 각각의 로프는 한 개씩만 존재한다.

 

2. 입력

첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 정수이다.

 

3. 출력

첫째 줄에 답을 출력한다.

 

4. 풀이

N = int(input())
rope = []
value = []
for i in range(N):
    rope.append(int(input()))
rope.sort(reverse=True) #1
for num in range(N):
    value.append(rope[num]*(num+1)) #2
print(max(value))

 

이 문제는 N번째로 큰 수를 N번 곱해주면 되는 문제이다. 
즉, 10과 15에서 10과 15의 무게를 버틸 수 있는 2개의 rope는 10이 최대로 버틸수 있는 무게이다. 그래서, rope가 2개이기 때문에 20의 무게가 최대 무게가 된다.
예제를 보면 N=2 이고, 입력값은 10과 15이다.
Rope에 입력을 받았을 때, Rope = [10, 15]가 들어간다.
이 Rope라는 리스트를 내림차순으로 정렬하면, Rope = [15, 10]이 된다.
첫 번째로, 정렬된 Rope 리스트에서 첫 번째 값인 15 rope는 15만 버틸 수 있고, 10 rope에서는 15를 못버티기 때문에 15가 최대 중량이다. 
두 번째로, 정렬된 Rope 리스트에서 두 번째 값인 10 rope는 10을 버틸 수 있고, 15 rope에서도 10을 버틸 수 있어서 최대 중량은 20이다.

위의 규칙에서 1번째 값은 1번만 버틸 수 있고, 2번째 값은 1번과 2번이 버틸 수 있기 때문에 
아래의 식이 세워진다.

rope[N] * N번째 자리

 

#1 : 최대값을 구해야 하기 때문에, 내림차순으로 정렬한다.

#2 : 위의 식을 나타낸 것이다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기