PI 문제!

  • dsj
    dsj

    책의 답안과 완전히 일치하지는 않지만,
    포함해야할 조건들을 포함한 것 같은데
    왜 오답이 나올까요..

    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<algorithm>
    #include<iostream>
    
    std::string num;
    int cache[10005];
    
    //해당 조각(begin ~ end) 의 난이도 계산
    int classify(int begin, int end)
    {
        //해당 조각 가져오기
        std::string P = num.substr(begin, end - begin + 1);
        int first = P[0];
        int sec = P[1];
        int diff = sec - first;
        bool check = false;
    
        //난이도 1인지 확인
        if (diff == 0)
        {
            for (int i = 1; i < (end - begin); i++)
            {
                if (P[i] == P[i + 1])
                    check = true;
                if (!check)
                    break;
            }
            if (check)
                return 1;
            check = false;
        }
    
        //난이도 2인지 확인 (단순증가)
        else if (diff == 1)
        {
            for (int i = 1; i < (end - begin); i++)
            {
                if (P[i+1] - P[i] == 1)
                    check = true;
                if (!check)
                    break;
            }
            if (check)
                return 2;
            check = false;
        }
    
        //난이도 2인지 확인 (단순감소)
        else if (diff == -1)
        {
            for (int i = 1; i < (end - begin); i++)
            {
                if (P[i+1] - P[i] == -1)
                    check = true;
                if (!check)
                    break;
            }
            if (check)
                return 2;
            check == false;
        }
    
        //난이도 4인지 확인
        for (int i = 1; i < (end - begin + 1); i++)
        {
            if (i % 2 == 0)
                check = P[i] == first;
            else
                check = P[i] == sec;
            if (!check)
                break;
        }
        if (check)
            return 4;
        check = false;
    
        //난이도 5인지 확인
        for (int i = 1; i < (end - begin); i++)
        {
            if (P[i+1] - P[i] == diff)
                check = true;
            if (!check)
                break;
        }
        if (check)
            return 5;
    
        //다 아니면 난이도 10
        return 10;
    }
    
    //시작 index가 begin 일 때 최소난이도 반환
    int memorize(int begin)
    {
        int& ret = cache[begin];
        //cache에 저장된 값 있으면 바로 반환
        if (ret != -1)
            return ret;
        int avail = num.size() - begin;
        if (avail < 3)
            return 0;
    
        //잔여 num의 갯수에 따라 가능한 경우를 나누고, 그 중 최소값을 return
        if (avail == 3)
        {
            return ret = classify(begin, begin + 3) + memorize(begin + 3);
        }
        if (avail == 4)
        {
            int a = classify(begin, begin + 3) + memorize(begin + 3);
            int b = classify(begin, begin + 4) + memorize(begin + 4);
            return ret = std::min(a, b);
        }
        else
        {
            int a = classify(begin, begin + 3) + memorize(begin + 3);
            int b = classify(begin, begin + 4) + memorize(begin + 4);
            int c = classify(begin, begin + 5) + memorize(begin + 5);
            int tmp = std::min(a, b);
            return ret = std::min(tmp, c);
        }
    }
    
    int main(void)
    {
        int C;
        scanf("%d", &C);
        for (int tc = 0; tc < C; tc++)
        {
            //초기화
            num.erase(0, num.length());
            memset(cache, -1, sizeof(cache));
    
            std:: cin >> num;
            printf("%d\n", memorize(0));
        }
        return 0;
    
    }
    

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