본문 바로가기

알고리즘

[파이썬 | SW Expert Academy] 컨테이너 운반

[문제]

 

화물이 실려 있는 N개의 컨테이너를 M대의 트럭으로 A도시에서 B도시로 운반하려고 한다.

트럭당 한 개의 컨테이너를 운반 할 수 있고, 트럭의 적재용량을 초과하는 컨테이너는 운반할 수 없다.

컨테이너마다 실린 화물의 무게와 트럭마다의 적재용량이 주어지고, A도시에서 B도시로 최대 M대의 트럭이 편도로 한번 만 운행한다고 한다.

이때 이동한 화물의 총 중량이 최대가 되도록 컨테이너를 옮겼다면, 옮겨진 화물의 전체 무게가 얼마인지 출력하는 프로그램을 만드시오.

화물을 싣지 못한 트럭이 있을 수도 있고, 남는 화물이 있을 수도 있다. 컨테이너를 한 개도 옮길 수 없는 경우 0을 출력한다.


[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 첫 줄에 컨테이너 수 N과 트럭 수 M이 주어지고, 다음 줄에 N개의 화물이 무게wi, 그 다음 줄에 M개 트럭의 적재용량 ti가 주어진다.

1<=N, M<=100, 1<=wi, ti<=50
 
[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

 

[풀이]

컨테이너와 트럭의 list를 만들어서 정렬한다.

 

그래서 뒤에서 부터 (큰 것부터) 탐색하면서, 제일 큰 컨테이너 값보다 큰 트럭 값이 있으면 해당 값을 ans 변수에 더한다.

 

그리고 컨테이너 및 트럭 리스트에서 빼면서, 두 리스트에 값이 없을때 까지 반복한다.

만약 컨테이너 값보다 큰 트럭값이 없으면, 그냥 그 컨테이너 값만 pop하고 계속 반복한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
= int(input())
for t in range(1, T+1):
    N, M = map(int, input().split())
    container = list(map(int, input().split()))
    truck = list(map(int, input().split()))
    
    container.sort()
    truck.sort()
    ans = 0
    while container:
        try:
            tempCon = container[-1]
            tempTrk = truck[-1]
        except:
            break
        if tempTrk >= tempCon:
            ans += container.pop()
            truck.pop()
        else:
            container.pop()
    print('#%d %d' % (t, ans))
cs