알고리즘, 자료구조/알고리즘

greedy알고리즘- 천칭저울 문제

바로이순간 2014. 5. 22. 11:51


하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 

이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 

양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓을 수 있고, 

다른 쪽에는 무게를 측정하려는 물건만 올려놓을 수 있다.


무게가 양의 정수인 N개의 저울추가 주어질 때, 이 추들을 사용하여 

측정할 수 없는 양의 정수 무게 중 최소값을 구하는 프로그램을 작성하시오.

예를 들어, 무게가 각각 3, 1, 6, 2, 7, 30, 1인 7개의 저울추가 주어졌을 때, 

이 추들로 측정할 수 없는 양의 정수 무게 중 최소값은 21이다.

실행 파일의 이름은 CC.EXE로 하고 실행시간은 1초를 넘을 수 없다. 

부분 점수는 없다.



입력 파일의 이름은 INPUT.TXT이다. 첫 째 줄에는 저울추의 개수를 나타내는 

양의 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 둘째 줄에는 저울추의 

무게를 나타내는 N개의 양의 정수가 빈칸을 사이에 두고 주어진다. 

각 추의 무게는 1이상 1,000,000 이하이다.


출력 파일의 이름은 OUTPUT.TXT이다. 첫째 줄에 주어진 추들로 측정할 수 

없는 양의 정수 무게 중 최소값을 출력한다.



● 1≤N≤10인 경우는 전체 테스트 데이터의 30%이다.



============================================


[1] 입력된 수들을 정렬합니다.

    7

    3  1  6  2  7  30  1 을 정렬합니다.

-------------------------------

    1  1  2  3  6  7  30


[2] 앞에서 부터 누적합을 구해갑니다.

    1   2  4  7  13 20 50   [누적값]

      \   \   \   \   \   \ 

    1   1  2  3   6  7  30    [정렬된수]


[3]위에서 와 같이 누적합과 각 수를 비교해봅니다.

     1 ( 2이하 수)  1

     2 ( 3이하 수)  2

     4 ( 5이하 수)  3

     7 ( 8이하 수)  6

   13 (14이하 수) 7

   20 (21이하 수) 30  만족하지 않음 *** 그래서 21이 측정될수 없는 최소값이 됩니다.


============================================================


#include <stdio.h>

int main() {

    FILE *f1, *f2;

    int data[1000]={0,}, sums[1000]={0,};

    int i, j, n, x, t;


    f1=fopen("INPUT.TXT", "r");

    if(f1==NULL) {

        printf("INPUT.TXT파일을 읽을 수 없습니다.\n");

        return 1;

    }

    fscanf(f1, "%d", &n);

    for(i=0;i<n;i+=1) {

        fscanf(f1, "%d", &data[i]);

    }

    fclose(f1);

    f2=fopen("OUTPUT.TXT", "w");


    // 선택정렬

    for(i=0;i<n-1;i+=1) {

        // 최소수의 인덱스 x

        x=i;

        for(j=i+1;j<n;j+=1) {

            if(data[j]<data[x]) {

                x=j;

            }

        }

        t=data[i];

        data[i]=data[x];

        data[x]=t;

    }


    // 누적합을 구한다.

    sums[0]=0;

    for(i=1;i<n;i+=1) {

        sums[i]=sums[i-1]+data[i-1];

    }


    // 해를 구한다.

    for(i=0;i<n;i+=1) {

        if(sums[i]+1<data[i]) {

            break;

        }

    }

    // 해를 출력한다.

    if(i<n) {

        fprintf(f2, "%d", sums[i]+1);

    } else {

        fprintf(f2, "해가 없습니다.");

    }

    fclose(f2);


    return 0;

}