[Python] 백준 2217번(로프) - 리스트, sys 모듈

2021. 9. 1. 00:42Programming/Python

문제

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

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

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

입력

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

출력

첫째 줄에 답을 출력한다.


아이디어

각 로프의 최대 중량을 구해 리스트를 짜면 되지 않을까? 로 접근해봤다.

 

1. 예를 들어, 10kg 20kg 30kg의 로프 3개가 있을 때, 3개 로프를 골고루 쓰게 된다면 10kg * 3 으로 최대 중량은 30kg가 된다. 10kg짜리 로프에는 10kg이상의 하중이 가해지면 안되기 때문이다. 

 

2. 똑같은 방식으로 만약 20kg 로프와 30kg 로프 2개만 쓴다면, 20kg * 2 로 최대 중량은 40kg가 된다.

 

3. 마찬가지로 30kg 로프 1개만 쓴다면, 최대 중량은 30kg이다.

 

이렇게 해서 구한 최대 중량들을 리스트화하여 가장 큰 값을 도출하면 된다.

코드

주요 코드 복습

1. 나는 로프 정보의 입력 값을 받기 위해 rope라는 리스트를 만들고 for문을 이용해 받은 변수 a값을 rope에 추가해주는 식으로 코드를 구성했다. 이를 좀 더 간결하게 표현하는 방식도 있다.

 

rope = [int(sys.stdin.readline()) for _ in range(N)]

 

이렇게 표현하면 4줄짜리 코드가 1줄로 절약 가능하다.

 

2. 입력값이 많을 때에는 input 함수를 쓰기보다는 파이썬 라이브러리 중 sys 모듈을 가져와서 쓰면 좋다.

 

input()  -> sys.stdin.readline()

 

만약 문자열을 입력 받을 때에는 rstrip()도 뒷부분에 추가해주자. 개행문자 \n을 지우기 위함이다.