LECTURE 관련 질문 있습니다.

  • 빠비
    빠비

    튜토리얼에 있는 LECTURE예제에 관련해서 질문드립니다.
    처음에는 재귀를 사용한 quicksort를 사용해서 코드를 작성했었는데 답안을 제출하니
    RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)
    이라는 런타임 오류가 떴었습니다.
    재귀함수 때문이라고 생각하고 비재귀로 배열을 이용하여 코드를 바꿨는데 같은 오류가 뜹니다. 문제가 어디에 있는 것일까요?
    아래는 제 코드입니다.

    /*입력받은 문자열을 2개씩 분리한 뒤 정렬하여 합친 결과를 반환하여라.*/
    #include <iostream>
    #include <string>
    using namespace std;
    
    void sort(string *arr, int size);
    
    int main(){
        int count;  //테스트케이스 수
        int index = 0;  //while문을 돌릴 변수
        int size = 0;   //문자열의 절반 길이를 넣는 변수(2개씩 묶이니까)
        string str;
        string result;  //정렬이 완료된 문자열을 넣는 변수
        string *super;  //테스트케이스 개수만큼 나열될 문자 배열
        string *arr;    //자른 문자열을 저장할 변수
    
        cin>>count;
        super = new string[count];
        for(int i=0;i<count;i++){
            cin>>str;
            size = (str.length())/2;
            arr = new string[30];
    
            while(!str.empty()){    //2개씩 자르기
                arr[index] = str.substr(0, 2);
                //cout<<arr[index]<<" / "<<str<<endl;
                str.erase(0,2);
                index++;
            }
    
            sort(arr, size-1);
    
            for(int j=0;j<size;j++){
                result.append(arr[j]);
            }
            super[i] = result;  //합쳐진 문자열을 super에 대입
            //기존에 쓰이던 변수들 초기화
            index = 0;
            result.erase(); 
        }
    
        for(int i=0;i<count;i++){
            cout<<super[i]<<endl;
        }
    
        delete []super;
        delete []arr;
    
        return 0;
    }
    
    void sort(string *arr, int size){
        int *stack = new int[2*size+2];
        int top = -1;
        int start, end, left, right;
        string pivot;
    
        //stack push
        stack[++top] = size;
        stack[++top] = 0;
    
        while(top!=-1){ //stack이 비어있지 않을 때
            //stack pop(먼저 들어간게 나중에)  
            start = stack[top--];
            //cout<<"start : "<<start<<endl;
            //cout<<"start top : "<<top<<endl;
            end = stack[top--];
            //cout<<"end : "<<end<<endl;
            //cout<<"end top : "<<top<<endl;
    
            if(start<end){  //정렬할만한 크기가 될 때
                left = start;
                right = end+1;
                pivot = arr[left];
    
                do {
                    do {left++;} while((left<=end)&&(pivot.compare(arr[left])>=0));
                    do {right--;} while((right>=start)&&(pivot.compare(arr[right])<0));
                    if(left<right){
                        arr[left].swap(arr[right]);
                    }
                }while(left<right);
                arr[start].swap(arr[right]);
    
                /*for(int i=0;i<size+1;i++){
                    cout<<arr[i]<<" ";
                }
                cout<<endl;*/
    
                //앞으로 정렬해야 할 범위들을 stack에 저장
                stack[++top] = end;   
                stack[++top] = right+1;  
                stack[++top] = right-1;  
                stack[++top] = start;   
            }
        }
    
        delete []stack;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • seico75
    seico75

    문자열 길이가 최대 1000 이라고 하는데 arr 크기는 30이네요.


    8년 전 link
  • 빠비
    빠비

    아 문제를 제가 덜 읽었었군요ㅠㅠ 감사합니다


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