ORDERING 질문입니다.

  • firenin
    firenin

    테스트 케이스는 만족하는데 오답이 뜨네요.

    알고리즘은 다음과 같습니다.

    위치가 정해진 경우를 자리를 잡았다라고 표현하겠습니다.
    ex) 입력
    4, 4 (4가지 일과, 4가지 작업순서)
    DA
    BD
    CA
    CD
    위와 같이 입력이 될 경우
    A부터 D까지 순회하면서

    A를 하기전에 해야하는 일이 있는지 검토하였습니다.

    위의 경우에는 D, C 를 해야 하는데 D와 C의 최소값인 C 를 이용하여

    C 보다 작지만 자리를 잡지 못한 B 를 인자로 함수를 재실행합니다.

    B 의 경우에는 선행되야 하는 작업이 없기 때문에

    벡터에 B를 넣습니다. 이제 B는 자리를 잡았습니다.

    다시 A로 와서 D, C 의 최소값인 C 를 위와 같은 방법으로 진행합니다

    C 역시 선행 작업이 없기 때문에 C를 넣습니다. C 도 자리를 잡았습니다
    A가 아직도 자리를 잡지 않았기 때문에 A 검토.

    D가 선행되야 하기 때문에 D를 검토합니다.

    D는 B와 C가 선행되어야 하는데, B,C 의 경우 이미 자리를 잡았기

    때문에 D를 벡터에 넣습니다. D 또한 자리를 잡았고

    남은 A를 넣어줍니다.

    벡터에는 BCDA 가 들어가 있고, 이를 순서대로 출력해줍니다.

    어느 부분이 잘못된건지 도움 부탁드립니다 ㅜㅜ

    #include <iostream>
    #include <vector>
    using namespace std;
    int C;
    int N;
    int M;
    char data[100 + 1][2 + 1];
    char origin[26 + 1];
    vector<char> result;
    void Find(char &c)
    {
        if (origin[c - 65] == '\0')
            return;
        bool isExist = false;
        char min = 99;
        for (int i = 0; i < M; i++)
        {
            if (data[i][1] != c)
            {
    
            }
            else
            {
                if (origin[data[i][0] - 65] != '\0')
                {
                    if (min > data[i][0])
                    {
                        min = data[i][0];
                    }
                    isExist = true;
                }
            }
        }
        if (isExist)
        {
            char p;
            for (int i = c + 1; i < min; i++)
            {
                p = i;
                Find(p);
            }
            result.push_back(min);
            origin[min - 65] = '\0';
            Find(c);
            c++;
        }
        else
        {
            result.push_back(c);
            origin[c - 65] = '\0';
        }
    
    }
    void Func()
    {
        int originIndex = 0;
        char target = 65;
    
        int count = N;
        for (int i = 0; i < N; i++)
        {
            Find(target);
            target++;
        }
    }
    
    void SetUp()
    {
        int alph = 65;
        for (int i = 0; i < N; i++)
        {
            origin[i] = alph++;
        }
    }
    int main()
    {
        cin >> C;
        while (C--)
        {
            cin >> N;
            cin >> M;
            SetUp();
            for (int i = 0; i < M; i++)
            {
                cin >> data[i][0];
                cin >> data[i][1];
            }
            Func();
            for (int i = 0; i < N; i++)
            {
                cout << result.at(i);
            }
            cout << endl;
            result.clear();
        }
        return 0;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • Being
    Being
    3 2
    CB
    BA

    같은 입력에서 제대로 동작하지 않을 것 같습니다.


    8년 전 link
  • firenin
    firenin

    감사합니다


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