GOODSET 문제 질문 드립니다!

  • bsy8220
    bsy8220

    GOODSET

    알고스팟을 이제 시작한 사용자입니다!
    제출한 답안이 오답일 경우 원인은 따로 나오지 않더군요..
    문제를 푼 알고리즘

    • 제가 푼 방식은 각 입력을 받으면서 총 문제에 대한 배열을 선언하여 푼 문제에 대해서는 1로 마킹하여 최종 결과는 마킹이 안된 문제가 있을 경우에는 NO를 출력하고 모든 문제에 대해서 마킹이 되어 있는 경우에는 YES를 출력하고 있습니다. 물론 문제에 주어진 조건에 맞지 않은 입력을 받았을 시에는 프로그램을 종료시키고 있습니다.


    몇가지 예외처리를 하고 다시 답을 제출했는데 계속 오답이 나오더군요..
    어떤 점이 잘못됬는지 찾아주시면 감사하겠습니다! 혹시 제가 질문이 처음이라 잘못된 부분이
    있으면 수정하겠습니다!

    #include <iostream>
    using namespace std;
    
    int main(int argc, const char * argv[]) {
        int caseCount = 0;
        int count[2];
        int proNum;
        int proArr[500];
        int input;
        bool result = false;
    
        cin >> caseCount;
    
        for (int i = 0; i < caseCount; i++) {
    
            cin >> count[0]; // 참가자 수
            if (count[0] <= 0 || count[0] > 500) {
                return 0;
            }
    
            cin >> count[1]; // 총 문제 수
            if (count[1] <= 0 || count[1] > 500) {
                return 0;
            }else{
                // 모든 문제를 0으로 초기화
                for (int i = 0; i < count[1]; i++) {
                    proArr[i] = 0;
                }
            }
    
            for (int j = 0; j < count[0]; j++) {
                cin >> proNum; // 참가자가 풀 수 있다고 예상되는 문제 수
    
                // 예상되는 문제의 수가 총 문제의 수를 넘을 경우
                if (proNum > count[1] || proNum < 0) {
                    return 0;
                }
    
                // 문제를 한 문제도 못푼 참가자가 있을 경우
                if (proNum == 0) {
                    result = false;
                    break;
                }
    
                // 모든 문제를 푼 참가자가 있을 경우
                if (proNum == count[1]) {
                    result = false;
                    break;
                }
    
                // 푼 문제에 대해서 1로 마킹
                for (int k = 0; k < proNum; k++) {
                    cin >> input;
                    proArr[input-1] = 1;
                }
            }
    
            for (int q = 0; q < count[1]; q++) {
                // 총 문제 개수에 대해 0이 존재할 경우 참가자들이 못 푼 문제가 존재하므로 좋은 문제가 아님
                if (proArr[q] == 0) {
                    result = false;
                    break;
                } else {
                    result = true;
                }
            }
    
            // 결과 출력
            if (result) {
                cout << "YES" << endl;
            }else{
                cout << "NO" << endl;
            }
        }
        return 0;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • etaehyun4
    etaehyun4

    입력 받는 도중에 result 가 false 가 되면 break; 를 하신 것이 문제가 됩니다. 한 테스트 케이스의 입력을 모두 받지 않아, 다음 테스트 케이스 입력 순서에 문제가 될 수 있습니다.


    8년 전 link
  • bsy8220
    bsy8220

    답변 감사합니다!


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