파이썬 코딩테스트

백준 2217번 - 로프 (파이썬/Python)

준벨롭 2024. 3. 3. 18:04

문제

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

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

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

입력

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

출력

첫째 줄에 답을 출력한다.

문제 링크

https://www.acmicpc.net/problem/2217

 

처음 제출한 답안

t = int(input())
r_arr = [] # 로프의 길이를 담을 배열
answer = 0 # 로프의 길이 * 숫자 값을 담을 배열
for _ in range(t):
    rope = int(input())
    r_arr.append(rope)
r_arr.sort(reverse=True) # 로프를 내림차순으로 정렬
for i in range(len(r_arr)):
    if answer <= min(r_arr[:i+1])*(i+1):# 로프의 최솟값 * 로프의 갯수의 값
        answer = min(r_arr[:i+1])*(i+1)
print(answer)
    
# 로프의 길이 내림차순으로 정렬
# 슬라이싱해서 로프의 최솟값 * 갯수의 최댓값 출력
# 시간초과

수정 답안

t = int(input())
r_arr = [] # 로프의 길이를 담을 배열
answer = [] # 로프의 길이 * 숫자 값을 담을 숫자
for _ in range(t):
    rope = int(input())
    r_arr.append(rope)
r_arr.sort(reverse=True) # 로프를 내림차순으로 정렬
for i in range(len(r_arr)):
    answer.append(r_arr[i]*(i+1))
print(max(answer))

 

후기

우선 가장 큰 무게를 들기 위해선 로프를 내림차순 정렬해줘야 한다.

그리고 로프가 버틸 수 있는 무게와 갯수를 곱한 값들을 answer에 넣으면

로프가 들수 있는 가장 큰 무게를 확인할 수 있다.

예를 들어

[10, 20, 100] 로프가 있다면, 내림차순 정렬을 이용해 [100, 20, 10]으로 바꿔준다.한개의 로프를 사용한다면 100*1 => 100을 들 수 있고두개의 로프를 사용한다면 20*2 => 40 을 들 수 있고 개의 로프를 사용한다면 10*3 => 30 을 들 수 있다.즉 들 수 있는 최댓값은 100이다.

 

반복문 안에 조건문을 넣어서 연산을 추가하니 시간초과가 나왔다.

그래서 answer라는 배열에 값들을 전부 집어넣어서 최댓값을 출력했다.

728x90