ZEROONE 푸는중에 질문 드립니다.

  • KimHansol
    KimHansol

    문제풀이에 제대로 접근하는건 아닌 것 같지만

    그냥 취미삼아 한문제씩 풀어보는거니 알고리즘과 관련된 답변은

    안해주셨으면 합니다... 혼자 끙끙거리면서 풀어내는걸 좋아해서요..
    .
    .

    아래부터는 궁금한 점입니다..코딩에서 막힐거라곤 생각도 안했는데..

    막혔네요..

    예를들어 수열이 "00001111"이라고 할때,

    indextable[][]이라는 배열에 {0,3} {4,7}이런식으로

    연속된 0과 1의 범위를 가상의 테이블에 넣어두고,

    i,j값은 테이블의 값만 참조해서 Yes,No를 결정하려고 합니다.

    그런데 이 테이블 만드는 과정에 문제가 생겼습니다.

    아래 코드를 실행시키고 수열 입력 후에 table에 들어간 값을 보니

    원하는 값이 들어가있지 않네요.

    예를들어 "010" 이 수열이라 하면,

    {0,0} {1,1} {2,2} 가 들어가야 할텐데

    {0,1} {1,2} {2,2} 가 들어갑니다..

    중단점 넣고 값 따라가봐도 별 이상없이 동작하는것 같은데,

    cout시켜보면 값이 이상하게 들어가있네요..

    아래는 전체 코드입니다..

    메인함수의 while(n--)부터는 작성하다 말아서

    넘어가셔도 됩니당..

    #include <iostream>
    #include <string>
    using namespace std;
    
    #define ARRYSIZE 1000001
    
    //global var
    char sequence[ARRYSIZE];
    int indexTable[ARRYSIZE][1];
    string returnString;
    
    int makeIndexTable(void)
    {
        int indexSize = 0;
        int i=0;
        while(true)
        {
            if(sequence[i] == '\0')     
                break;
    
            else
            {
                indexTable[indexSize][0] = i;
                while(true)
                {
                    //연속적으로 같은 문자열이면
                    if(sequence[i] == sequence[i+1])
                    {
                        i++;
                        continue;
                    }
                    //다른 문자나 널문자 발견시
                    else
                    {
                        indexTable[indexSize][1] = i;
                        i++;
                        break;
                    }
                }
                indexSize++;
            }
        }
        return indexSize;
    }
    
    int main(void)
    {
        int i, j, n;
    
        cin >> sequence;
        cin >> n;
    
        int indexSize = makeIndexTable();
    
    
    
        /*임시*/
        for(int x=0; x<indexSize; x++)
            cout<< indexTable[x][0] << " " << indexTable[x][1] << endl;
        /*임시*/
    
    
    
        while(n--)
        {
            cin >> i >> j;
    
            if(i > j)
            {
                int temp = i;
                i=j;
                j=temp;
            }
    
            returnString = "No";
            for(int index=0; index<indexSize; index++)
            {
                if(i <= indexTable[index][0])
                {
                    if(j <= indexTable[index][1])
                        returnString = "Yes";
                    break;
                }
            }
            cout << returnString << endl;
        }
    }
    

    글 읽어주신 모든분께 감사드립니다.


    11년 전
3개의 댓글이 있습니다.
  • Kureyo
    Kureyo

    int indexTable[ARRYSIZE][1];를
    int indexTable[ARRYSIZE][2];로
    바꿔보세요


    11년 전 link
  • KimHansol
    KimHansol

    으앜...................감사합니다..
    어제 함수만 뚫어지게 쳐다봤었네요;;


    11년 전 link
  • KimJJ
    KimJJ

    이런 종류 문제(원하는 값이 아닌 이상한 값이 들어가는 문제)의 십중팔구가 배열 범위 초과 문제입니당. ASSERT문을 이용해서 디버그하는 것도 한 방법이고, 배열 대신 vector를 사용하면 런타임 단계에서 오류를 내는 라이브러리도 있습니다.


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