자꾸 런타임 에러뜨네요.. 11번;;;

  • 공상가
    공상가

    모처럼, 인형문제를 시뮬레이션이 안된다고 해서, 중간고사도 끝났겠다. 너 잘걸렸다 싶어서,
    오늘 하루종일 붙잡아서 겨우 부득부득 이를 갈면서 풀어냈습니다...ㅋㅋㅋㅋㅋㅋㅋㅋ
    근데... 이걸 올리고 컴파일이란녀석을 시켜봤더니 런타임에러라는 말이 왠말입니까;;;
    스트럭쳐구문에 대한 포인터가 안먹히는건가요???...
    너무 답답해서 돌아가시겠어요...;ㄴ;
    한번은, 설마.. 싶어서 std::cin으로 돌린것들 모두 scanf로 갈아치워주고... 그래도 작동을 안해요...=_=;;;
    Cout쪽도 갈아줘야 하는건지;;;(어짜피 요건 Call by Reference라서 상관없잖아요;;)
    아님 스트럭쳐 포인터가 안먹힌다면, 어떻게 이놈을 설정해야 한다는건지...
    누가 제 소스에서 메모리 참조 에러가 날만한 부분을 분석해주실 수 있으신가염?ㅠ_ㅠ

    #include <iostream>
    #include <cstdio>
    #define MAX 100000
    using namespace std;
    typedef struct _arr {
        int val;
        int idx;
    } data;
    void merge(int,int,data*);
    void program();
    int main() {
        int casen;
        scanf("%d",&casen);
        while(casen--) {
            program();
        }
        return 0;
    }
    void merge(int left, int right, data* arr) {
        if((right-left)==1) return;
        int half=(left+right)/2;
        merge(left,half,arr);
        merge(half,right,arr);
        int i=left;
        int j=half;
        int k=left;
        data temp[MAX];
        while(i<half&&j<right) {
            if(arr[i].val<arr[j].val) {
                temp[k].val=arr[i].val;
                temp[k++].idx=arr[i++].idx;
            }
            else {
                temp[k].val=arr[j].val;
                temp[k++].idx=arr[j++].idx;
            }
        }
        while(i<half) {
            temp[k].val=arr[i].val;
            temp[k++].idx=arr[i++].idx;
        }
        while(j<right) {
            temp[k].val=arr[j].val;
            temp[k++].idx=arr[j++].idx;
        }
        for(i=left;i<right;i++) {
            arr[i].val=temp[i].val;
            arr[i].idx=temp[i].idx;
        }
    }
    void program() {
        int type=0, g_doll=0;
        int remain=0;
        data arr[MAX];
        int total=0;
        int used[MAX]={0};
        int temp;
        scanf("%d %d",&type,&g_doll);
        remain=g_doll;
        for(int i=0;i<type;i++) {
            scanf("%d",&arr[i].val);
            arr[i].idx=i;
            total+=arr[i].val;
        }
        merge(0,type,arr);
        for(int i=0;i<type;i++) {
            if(arr[i].val*type<=g_doll) {
                used[arr[i].idx]=arr[i].val;
                remain-=arr[i].val;
                if(arr[i].val*type<g_doll) {
                    g_doll+=((g_doll/type)+(g_doll%type?1:0)-(arr[i].val))/type;
                }
                continue;
            }
            used[arr[i].idx]=g_doll/type;
            remain-=g_doll/type;
            temp=i;
        }
        used[arr[temp].idx]+=(remain<arr[temp].val?remain:arr[temp].val);
        for(int i=0;i<type;i++) {
            cout<<used[i]<<" ";
        }
        cout<<endl;
    }
    
    ~~~<div>[ 글은 과거 홈페이지에서 이전된 글입니다. <a href="http://algospot.andromeda-express.com/zbxe/qna/58277">원문보기</a>]</div>
    

    15년 전
5개의 댓글이 있습니다.
  • A.I
    A.I

    로컬에서 직접 돌려보시고 submit 하셨는지 궁금합니다.
    예제는 돌려보셨는지...


    15년 전 link
  • Toivoa
    Toivoa

    관리자 권한으로 코드를 보기 편하도록 본문을 수정하였습니다. ^^;
    일단 런타임 에러는 함수 내에서 잡고 있는 로컬 변수의 크기가 너무 커서 생기는 stack oveflow 때문인것 같습니다.
    merge와 program 함수 내에 있는 data arr[MAX], data temp[MAX], int used[MAX] 를 전역으로 잡고 보내보니 wrong answer가 나오네요.


    15년 전 link
  • 공상가
    공상가

    Toivoa//네 그럴겁니다.. 다시 수식 검토 해보니까, 문제가 있군요... 그리고 전역으로 보낸뒤에.. 초기화가 안되서 그럴겁니다 아마.ㅠ_ㅠ...


    15년 전 link
  • 공상가
    공상가

    예. 로컬에서 직접 돌려보고 하다가 안돼서 왔습니다.
    이렇게 복잡한 소스에 대해서는 혼자서 디버깅 하기 번잡합니다.-_ㅠ


    15년 전 link
  • A.I
    A.I

    로컬에서 돌리셨어도 아마 바로 stack overlfow 뜨셨을텐데 너무 많이 submit을 하셨길래...^^;


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