PICNIC 시간초과 질문

  • chatterboy
    chatterboy

    안녕하세요.
    문제해결전략 책으로 공부하는 학생입니다.
    어찌어찌 코딩을 완성을 했지만 시간초과가 뜨더군요.
    가장 맥스값을 대입해보고 디버깅을 돌려봤습니다.
    입력
    1
    10 45
    ...
    그런데 에러가 전혀 생각치 못한 곳에서 발생을 했고
    해결 방법이 도무지 생각이 나지 않아서 질문합니다.

    에러는 메인 함수에서 2차원 배열 whoPairs[2][45];에
    값을 대입시키는 곳에서 발생했습니다. 계속 입력을 받다가
    j=23인 순간 에러를 뿜고 끝나버리더군요.

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int result[10] = {0};
    
    int pairsAmt(int n, int m, int pairs, int taken[], int whoPairs[][45]) {
        // 친구 쌍을 모두 만들면 실행
        // 모든 학생이 친구끼리 짝이 되었다면 1을 리턴
        // 아니라면 0을 리턴한다
        if (pairs > n/2) {
            bool isAllPairs = true;
            // 만약 친구끼리 짝이 적어도 하나가 되지 않았다면
            // 무조건 실패
            for (int i = 0; i < n; i++)
                if (!taken[i])
                    isAllPairs = false;
    
            if (isAllPairs)
                return 1;
            else
                return 0;
        }
    
        int total = 0;
        for (int i = 0; i < m; i++) {
            taken[whoPairs[0][i]] += 1;
            taken[whoPairs[1][i]] += 1;
            //
            total += pairsAmt(n, m, pairs+1, taken, whoPairs);
            //
            taken[whoPairs[0][i]] -= 1;
            taken[whoPairs[1][i]] -= 1;
        }
        return total;
    }
    
    // 중복 처리
    int factorial(int n) {
        if (n == 1)
            return 1;
        else
            return n*factorial(n-1);
    }
    
    int main() {
        int C; cin >> C;
        for (int i = 0; i < C; i++) {
            int n, m; cin >> n >> m;
            int whoPairs[2][45] = {{0}, {0}};
            for (int j = 0; j < m; j++)
                cin >> whoPairs[0][j] >> whoPairs[1][j];
    
            // 짝을 맺었는지에 대한 여부
            int taken[10] = {0};
            // pairs = 1부터 시작한다
            result[i] = pairsAmt(n, m, 1, taken, whoPairs)/factorial(n/2);
        }
    
        for (int i = 0; i < C; i++)
            cout << result[i] << "\n";
    
        return 0;
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    23이면 딱 45 절반이라 입력 개수가 모자란 게 아닌가 싶습니다.


    10년 전 link
  • chatterboy
    chatterboy

    답변 감사합니다


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