Festival 문제 답안제출 및 RTE 관련 질문입니다.

  • tjscks0510
    tjscks0510

    먼저.. 지금 많이 부족해서 배우고 있는 중이라서 정말 어이없는 질문이지 않을까 하다가.. 질문 남깁니다.

    (소스를 다 올려도 되는게 맞는지 모르겠지만.. 처음 올리는 질문이라 잘못되거나 부족하면 지적해주시면 고치도록 하겠습니다. )

    "프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략" 책을 읽고 방문하게 되었고 FESTIVAL 문제를 풀고 제출 해보았는데

    먼저 VS2015 CPP 로 생성해서 c++제출을 하였는데..
    문법은 scanf로 되있긴 합니다.... 이 부분도 문제 있다면 고치겠습니다.

    런타임 오류가 표시되었고 에러메시지는 아래와 같습니다.

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)

    제가 작성한 소스는 아래와 같습니다..

    #pragma warning(disable:4996)
    
    #include <stdlib.h> 
    #include <stdio.h>
    
    // 상수
    #define TestCase_MAX 100
    #define numDays_MAX 100
    #define numTeam_MAX 1000
    
    int main() {
    
        // 변수선언
        int TestCase;   // 테스트 케이스 수
    
        int number_case[TestCase_MAX][2];   // 테스트 케이스 수 만큼 대여 가능한 날의 수와 이미 섭외한 팀의 수를 입력하기 위해 
    
        double DaysCost[TestCase_MAX][numDays_MAX];     // 공연장을 대여할 수 있는 날들의 수 N(1<=N<=100)
    
        // 케이스에 따라 최소 비용을 저장할 배열 변수....
        double MinCost[TestCase_MAX];
    
        //for문의 시작에 사용될 변수.
        int start;
        int i = 0;
        int j = 0;
    
    
        double sum = 0.0;       // 합계
        double avg = 0.0;   // 평균
        double count = 0.0;     // 최소 날짜
    
        // 비교를 위한
        double max = 999999.99999;
        double min = 0.0;
    
        // 입력
        printf("테스트를 몇 번 하시겠습니까 ? \n");
        scanf("%d", &TestCase);
    
        printf("대여 가능한 날의 수와 이미 섭외한 팀의 수를 입력하세요. \n");
        printf("이어서 비용을 입력하세요. \n");
        for (start = 0; start < TestCase; start++) {        
                scanf("%d %d", &number_case[start][i], &number_case[start][i+1]);
    
                for (j = 0; j < number_case[start][i]; j++) {   // 대여 가능한 날의 수 만큼.. 
                    scanf("%lf", &DaysCost[start][j]);  // 행렬의 열에 값을 반복해서 비용을 넣어주고.. 
                }
        }
        // 처리
        for (start = 0; start < TestCase; start++) {    // TestCase 만큼
            for (i = 0; i < number_case[start][0]; i++) {   // 대여가능한 날만큼
                for (j = i; j < number_case[start][0]; j++) {   // 시작하는 값을 변동해서 비교 하기 위해서.
                    /*count++;
                    while (count >= number_case[start][j]) {
                        sum += number_case[start][j];
                    }*/
                    sum += DaysCost[start][j]; // 모든 비용을 더해주고. 
                    count++;
    
                    if (count >= number_case[start][1]) {   // count가 섭외한 팀보다 같거나 크면
                        min = sum / count;
                        if (min < max) {
                            max=min;
                        }
                    }
                }
                MinCost[start] = max;
                sum = 0.0;
                count = 0.0;
            }   
    
        }
    
        // 출력
    
        for (i = 0; i < TestCase; i++) {
            printf("%d 번째 테스트 케이스의 최소비용은 : %.10lf\n", i + 1, MinCost[i]);
        }
    
        return 0;
    }
    

    문제를 푸는 것만 집중했지.. 이렇게 처음 올려보니깐 여러가지로 복잡하기도 하고 부끄럽기도 한 거 같네요.. 계속해서 잘 부탁드립니다.


    7년 전
5개의 댓글이 있습니다.
  • Corea
    Corea

    1 \le N \le 1000 입니다.


    7년 전 link
  • Corea
    Corea

    그리고 출력하실 때에는 출력형식에 맞춰 딱 답만 출력하셔야합니다.


    7년 전 link
  • tjscks0510
    tjscks0510

    제가 작성한 소스가 많이 문제가 있나요?
    #define numDays_MAX 1000 이 부분을 변경하고
    뒤에 출력문도 printf("%.10lf\n", MinCost[i]); 만 적었습니다.
    그런데 오답이라고 뜨던데.. 그거는 . .
    1≤N≤1000 예외 처리를 하지 않아서 발생한 문제인가요?


    7년 전 link
  • hyunhwan
    hyunhwan

    간단히 훑어봤는데, 매번 테스트케이스를 처리하신 다음에 min과 max를 초기화 하지 않는데, 이 때문에 문제가 발생하는거 아닐까 합니다.


    7년 전 link
  • tjscks0510
    tjscks0510

    아 두 분 다 너무 감사합니다~ ㅎㅎ


    7년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.