공부하기/백준

[Python] 백준 풀기 2217 - 로프

XEV 2022. 12. 10. 19:25

파이썬 백준 2217번

실버 4

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

 

2217번: 로프

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 수학, 그리디 알고리즘, 정렬

 

 

 

 

 

문제 풀기

최대 중량을 들기 위해서는 단일 로프가 허용하는 중량이 클수록 그리고 중량을 분산할 로프가 많을수록 유리하다.

따라서 임의의 순서로 주어지는 로프의 중량 정보를 내림차순 정렬을 하고 가장 허용 중량이 작은 로프부터 하나씩 제거해 가며 최댓값을 찾는다.

 

 

내림차순 정렬된 로프 리스트에서 맨 오른쪽 데이터를 하나씩 pop() 시켜 분산하여 들수 있는 값 weight 를 계산한다.

매 for loop 를 돌때마다 weight 값이 그 전의 최대값인 max_weight 보다 크면 새로 저장한다.

제일 작은 로프를 하나씩 지워가며 모든 경우를 따져 보고 저장된 max_weight 값을 출력한다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline


def fnMaxWeight(N):
    max_weight = 0          ## 최대 질량 초기화.
    rope_ls.sort(reverse = True)            ## 오른쪽 pop 을 하기위해 내림차순 정렬.
    # print(rope_ls)          # test print
    
    for _ in range(N):
        rope_temp = rope_ls.pop()           ## 제일 작은 로프부터 하나씩 빼냄.
        weight = rope_temp * (len(rope_ls) + 1)         ## 빼낸 로프와 더 긴 나머지 로프들이 가질수 있는 무게 저장.
        if max_weight <= weight:            ## 새로 계산된 weight 와 이전 반복문에서 저장된 max_weight 와 비교.
            max_weight = weight             ## 새 weight 가 더 크면 max_weight 로 전환.
            
    print(max_weight)           ## 가장 긴 로프를 중심으로 모든 경우가 계산된 max_weight 값 출력.


if __name__ == "__main__":
    N = int(inputdata().strip())
    rope_ls = []
    for _ in range(N):
        rope_ls.append(int(inputdata().strip()))
    # print(rope_ls)          # test print
    
    fnMaxWeight(N)

 

 

 

 

 

추가 하기

import sys
inputdata = sys.stdin.readline


def fnMaxWeight(N):
    max_weight = 0          ## 최대 질량 초기화.
    rope_ls.sort(reverse = True)            ## 오른쪽 pop 을 하기위해 내림차순 정렬.
    print(f'rope_ls: {rope_ls}')          # test print
    
    for _ in range(N):
        rope_temp = rope_ls.pop()           ## 제일 작은 로프부터 하나씩 빼냄.
        weight = rope_temp * (len(rope_ls) + 1)         ## 빼낸 로프와 더 긴 나머지 로프들이 가질수 있는 무게 저장.
        if max_weight <= weight:            ## 새로 계산된 weight 와 이전 반복문에서 저장된 max_weight 와 비교.
            max_weight = weight             ## 새 weight 가 더 크면 max_weight 로 전환.
        
        print(f'weight: {weight}')          # test print
        print(f'max_weight: {max_weight}')          # test print
        print(f'rope_ls: {rope_ls}')            # test print
            
    print(max_weight)           ## 가장 긴 로프를 중심으로 모든 경우가 계산된 max_weight 값 출력.


if __name__ == "__main__":
    N = int(inputdata().strip())
    rope_ls = []
    for _ in range(N):
        rope_ls.append(int(inputdata().strip()))
    print(rope_ls)          # test print
    
    fnMaxWeight(N)



# 3
# 10
# 5
# 18


# [10, 5, 18]

# rope_ls: [18, 10, 5]
# weight: 15
# max_weight: 15

# rope_ls: [18, 10]
# weight: 20
# max_weight: 20

# rope_ls: [18]
# weight: 18
# max_weight: 20

# rope_ls: []


# 20