Computer_Language/Algorithm

[백준] 2217번 로프 파이썬 해설

Joo-Topia 2019. 9. 29. 15:05

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

 

2217번: 로프

N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다. 각 로프들에 대한 정보가 주어졌을 때, 이 로프들을

www.acmicpc.net

그리디 알고리즘으로 분류된 문제이다.

그리디 알고리즘의 정의는 미리 정한 기준에 따라서 매번 가장 좋아 보이는 답을 선택하는 알고리즘이다.

문제에 적용시켜보자.

 

풀이


먼저 문제의 조건을 잘 읽어야 한다.

"모든 로프를 사용해야 할 필요는 없으며"

이 말은 로프가 두 개 주어지고 두 로프가 버틸 수 있는 최대 중량이 1, 10이라면

굳이 두 개의 로프를 사용하지 않고 두 번째 로프만 사용하는 것이 더 많은 중량을 버틸 수 있다.

 

-정답 코드

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    N = int(input())
    arr = []

    for i in range(N):
        arr.append(int(input()))
    arr.sort(reverse=True)

    m = 0
    for i in range(len(arr)):
        temp_max = arr[i] * (i+1)
        if temp_max > m:
            m = temp_max

    print(m)

먼저 리스트 arr에 모든 입력을 받은 뒤 내림차순으로 정렬한다.

반복문 안에서는 다음과 같은 동작을 한다.

1) i = 0일 때 : 가장 최대의 중량을 버틸 수 있는 로프의 정보 x 1

2 - 1) i = 1일 때 : 두 번째로 많은 중량을 버틸 수 있는 로프의 정보 x 2

2 - 2) i = 0 일 때와 비교하여 더 많은 양의 중량을 m값에 저장.

3) 리스트 arr의 길이만큼 반복.

 

위 반복문이 끝나면 m에는 주어진 조건에서 가장 많이 버틸 수 있는 중량이 저장된다.

 

결과


이번 문제는 한 번의 시도만에 맞아서 괜히 기분이 좋아지는 문제였다. ㅎㅎ

블로그를 운영한 지 얼마 되지 않아서 나만의 프레임이 없다.

매번 새로운 프레임으로 예쁘게 정리해보려고 노력 중이다.