[백준] 2217번 로프 - python (실버4)

연기리·2023년 6월 20일

Algorithm

목록 보기
1/3
post-thumbnail

⚔️ 문제

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

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

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

🤔 문제 요약

  • k개의 로프, w무게의 물체 ➡️ 각 로프에 w/k 중량이 가해짐
  • 입력 : 로프의 개수(n), 각 로프의 최대중량
  • 출력 : 로프들을 이용해 들을 수 있는 최대중량
  • 주의 : 모든 로프 사용안해도 되고, 1개만 사용해도 됨

👩🏻‍💻 풀이 핵심

  • 로프의 순서는 중요하지 않고, 최대 중량이 가장 작은 로프부터 확인해봐야함
    극단적으로 200, 100, 1일 경우를 생각해보자
    3개의 로프로 들 수 있는 무게는 301/3 = 100..
    2개의 로프(200, 100) 들 수 있는 무게는 150
    1개의 로프(200)로 들 수 있는 무게는 200
  • 결론적으로 오름차순 정렬을 하고, 작은 거부터 하나씩 제껴가면서 마지막엔 가장 큰 로프 혼자만 따져볼 수 있도록 해야한다.
  • 그렇다면 필요한 건, 1. 정렬 2. 인덱스 위치

📝 정답 코드

n = int(input())
rope = list()

for i in range(n):
    rope.append(int(input()))

rope.sort()

max_weight = -1
len_rope = len(rope)
idx = 0

while(True):
    if len_rope <= 0:
         break
    if rope[idx] * len_rope > max_weight:
        max_weight = rope[idx] * len_rope
    idx += 1
    len_rope -= 1

print(max_weight)

더 좋은 방법이나, 잘못된 기술된 부분이 있다면 언제든 편하게 남겨주시면 큰 도움이 될 것같습니다.😊

profile
저에게 말을 걸어주세요

0개의 댓글