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

  • User Avatar
    tjscks0510

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

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

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

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

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

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

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


    ~~~ c++
    #pragma warning(disable:4996)

    #include
    #include

    // 상수
    #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;
    

    }

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

    9년 전
5개의 댓글이 있습니다.
  • User Avatar
    Corea

    $1 \le N \le 1000$ 입니다.


    9년 전 link
  • User Avatar
    Corea

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


    9년 전 link
  • User Avatar
    tjscks0510

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


    9년 전 link
  • User Avatar
    hyunhwan

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


    9년 전 link
  • User Avatar
    tjscks0510

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


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