LECTURE 알고리즘을 구현한 소스에서 오답으로 뜨는데 어느것이 문제인지...

  • hecker304
    hecker304

    안녕하세요.

    문자열 정렬 알고리즘 LECTURE에 대한 제출 답안으로 아래와 같이 했습니다.
    단순 입출력 문제는 아닌것 같고, 뭔가 제가 찾지 못하는 다른 예외가 있는것 같은데...

    기본 구현 방식은

    각 입력받은 스트링에서 앞에서 부터 2개씩 잘라 따로 array에 보관하고, 타겟 스트링에서 해당 문자열을 가진 애들을 모두 제거합니다. 그리고 원본 스트링과의 차이에서 /2를 하여 반복 스트링 갯수를 알아내고, 이것을 반복스트링갯수만큼 append하여 order string array에 카피합니다. 이 과정을 스트링의 길이가 0이될때까지 반복하며, 완료되면 order string array에 담긴 값들을 0인덱스 1인덱스의 char의 ASCII값을 이용하여 사전순으로 정렬 후 보여줍니다.

    구현한 소스는 아래와 같습니다. 어느것이 문젠지 도통 감이 안잡히네요.

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        int t = 0;
        cin >> t;
        string *arr = new string[t];
        int id = t-1;
    
        while (t > 0)
        {
            string s1 = "";
            cin >> s1;
            t--;
            arr[t] = s1;
    
        }
    
        while (id >= 0)
        {
    
            string t1 = arr[id];
            id -= 1;
    
            int t2 = t1.length();
            int f1 = t2 / 2;
            bool is1 = true;
            int n = 2;
            string *ar2 = new string[(t2 / 2) + (t2 % 2)];
            int i2 = 0;
            while (is1)
            {
    
                string t3 = t1.substr(0, 2);
                int p1 = 0;
                while ((p1 = t1.find(t3)) != string::npos){
                    t1.erase(p1, t3.length());
                }
                p1 = 0;
                if ((p1 = t2 - t1.length()) > 0)
                {
    
                    string r1 = "";
                    for (int q = 0; q < p1 / 2; q++)
                    {
                        r1 += t3;
                    }
    
    
                    ar2[i2] = r1;
                    i2++;
                }
                t2 = t1.length();
    
                if (t1.length() < 2)
                {
                    if (t1.length() != 0)
                    {
                        ar2[i2] = t1;
                        i2++;
                    }
                    is1 = false;
                    break;
                }
            }
    
            string *t3 = ar2;
            string *o1 = new string[i2];
            for (int c = 0; c < i2; c++)
            {
                string c0 = ar2[c];
                int f1 = c0.at(0);
                int s1 = 'z';
                if (c0.length() >= 2)
                {
                    s1 = c0.at(1);
                }
    
                int on = i2;
                for (int d = 0; d < i2; d++)
                {
                    if (c != d)
                    {
                        int c0_f1 = t3[d].at(0);
                        int c0_s1 = 'z';
                        int s1 = 'z';
    
                        if (t3[d].length() >= 2)
                        {
                            c0_s1 = t3[d].at(1);
                        }
    
                        if (f1 < c0_f1)
                        {
                            on -= 1;
                        }
                        else if (f1 == c0_f1 && s1 < c0_s1)
                        {
                            on -= 1;
                        }
                        else
                        {
                            if (on < i2 - 1)
                            {
                                on += 1;
                            }
                        }
                    }
                }
    
                int i0 = on - 1;
                while (true)
                {
                    if (o1[i0] != "")
                    {
                        i0 -= 1;
                    }
                    else
                    {
                        o1[i0] = c0;
                        break;
                    }
    
                }
            }
    
            for (int i = 0; i < i2; i++)
    
            {
                cout << o1[i];
            }
            cout << endl;
    
        }
    
        return 0;
    }
    


    9년 전
1개의 댓글이 있습니다.
  • JongMan
    JongMan

    랜덤 입력을 여러 개 만들어서 돌려 보시고, 결과가 실제로 정렬되어 있는지 확인하는 프로그램을 짜서 체크하시면 좋지 않을까요?


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