카테고리 없음

백준 BOJ 11256 : 사탕 - 파이썬

아아네잔 2023. 11. 8. 23:56

문제

당신은 사탕 공장의 주인이다. 날마다, 당신은 J개의 사탕을 가게에 보내기 위해 상자에 포장해야 한다.

당신은 크기가 다른 상자 N개를 가지고 있다. 당신은 편리를 위해 상자를 최소한으로 쓰려고 한다. (박스를 다 채울 필요는 없다. 일부분만 채워도 된다.)

당신이 공장에서 나오는 사탕의 개수와 각 상자의 크기를 입력받고, 상자를 최소한으로 쓸 때의 사용되는 상자 개수를 출력하는 프로그램을 작성하라. 사탕들을 포장할 공간은 충분하다는 것이 보장된다.

입력

첫 번째 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각각의 테스트 케이스는 아래 형식을 따른다.

테스트 케이스의 첫 번째 줄에는 사탕의 개수 J와 상자의 개수 N이 주어진다. (1 ≤ J, N ≤ 1,000)

다음 N개의 줄에는 각각 줄마다 i번째 상자의 세로 길이 Ri 그리고 가로 길이 Ci가 주어진다. 상자의 크기는 다른 상자의 크기와 똑같을 수도 있다. 상자에는 Ri * Ci보다 더 많은 사탕을 포장할 수 없다. (1 ≤ Ri, Ci ≤ 10,000)

출력

출력은 T개의 줄로 이루어진다. 각각의 줄마다 i번째 테스트 케이스에서 최소한의 상자 개수를 출력하여야 한다.

예제 입력 1 

1
20 5
3 4
2 5
1 8
3 3
2 5

예제 출력 1

2

예제 입력 2 

2
12 3
2 7
1 5
3 2
20 3
2 7
1 5
3 2

예제 출력 2 

1
2

 

알고리즘 분류

  • 그리디 알고리즘
  • 정렬

 

제출 코드

def function():
    T = int(input())  # 테스트 케이스 수

    for _ in range(T):  # 테스트 케이스 수 만큼 반복
        J, N = map(int, input().split())
        boxSize = []
        count = 0

        for i in range(N):
            R,C = map(int, input().split()) # 상자 가로세로 길이를 입력받아 저장
            boxSize.append(R * C) # 상자크기 (가로*세로)

        boxSize.sort(reverse=True) # 상자크기를 내림차순으로 정렬

        while J > 0:
            J -= boxSize[count]  # 사탕을 박스에 넣었으니 사탕갯수를 박스사이즈만큼 빼기
            count += 1  # 상자가 1개 쓰였으니 카운트세기

        print(count)

if __name__ == "__main__":
    function()