재배치

주어진 배열의 순서를 마음대로 정해 n에서 차례로 빼면서 n이 0 이하가 될 때 멈출 때, 얻을 수 있는 가장 작은 반환값을 구한다.

보통4그리디정렬면접 대비아직 제출이 없습니다시간 제한1초메모리 제한512 MB

문제

아래는 getMin( ) 함수의 코드다.

int getMin(int n, int arr[]){
    arr2 = rearrange(arr);
    for(int i = 0; i < arr2.length(); i = i+1){
        n = n-arr2[i];
        if (n <= 0) break;
    }
    return n;
}

getMin( )은 정수 nn과 정수 배열 arr를 받아 rearrange( )를 호출한다. rearrange( )는 정수 배열을 받아 새 배열을 돌려준다. 새 배열의 원소는 원래 배열의 원소와 같고, 각 원소의 위치는 바뀔 수 있다.

rearrange( )를 어떻게 구현하는지는 채점하지 않는다. getMin( )의 반환값을 가장 작게 만드는 배치를 골랐을 때 그 반환값을 구하라.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. (1T101 \le T \le 10)

각 테스트 케이스는 두 줄이다. 첫 줄에는 정수 nn과 배열 arr의 길이 kk가 공백으로 구분되어 주어진다. (0n100000 \le n \le 10000, 0k100000 \le k \le 10000) 둘째 줄에는 arr[0]부터 arr[k-1]까지 정수 kk개가 공백으로 구분되어 주어진다. (0arr[i]10000000 \le \texttt{arr}[i] \le 1000000) kk00이면 둘째 줄은 빈 줄이다.

출력

각 테스트 케이스마다 getMin( )이 돌려줄 수 있는 최솟값을 한 줄에 하나씩 출력한다. 값은 음수일 수 있다.

힌트

예제의 둘째 테스트 케이스에서 rearrange( )[70, 60, 80]을 넘기고 [80, 70, 60]을 돌려받으면 10080=20100 - 80 = 20이고 2070=5020 - 70 = -50이라 반복문이 멈춰 50-50을 반환한다. 반환값을 최소로 만드는 배치는 여러 가지일 수 있지만, 출력하는 값은 그 최솟값 하나다.