[WEEKLYCALENDAR]문제 오답원인을 모르겠습니다.

  • skylife927
    skylife927

    1월 1일 각 해당 월마다 전부 테스트해봤습니다.
    오답이 발생하는데요. 어떤 케이스에서 오답이 발생하는지 잘 모르겠습니다.

    #include <iostream>
    
    using namespace std;
    
    int leftValue(int *m, int *d){
        //d의 범위는 1부터 31까지 올 수 있다.
        //m의 범위는 1부터 12까지 올 수 있다.
    
        //m을 통해 값이 어떤값을 나오게 할지 판단할 수 있다.
    
        //d가 1이면 m을 확인하여 이전 달의 끝날짜를 가져와서 리턴
        //d가 2이상 31이하면 그냥 -1한 값을 가져오면 끝이 난다.
        if(*d >=2 && *d<=31){
            *d-=1;
            return *d;
        } else if( *d==1){
            // 1, 3, 5, 7, 8, 10, 12는 31일이고 2월은 28일, 4, 6, 9, 11은 30일까지입니다.
            int t = 0;
            if(*m>=2) *m-=1;
            else if(*m==1) *m = 12;
            if(*m == 1 || *m==3 || *m==5 || *m==7 || *m == 8 || *m==10 || *m==12){
                t=31; *d = 31;
            } else if (*m== 4 || *m== 6 || *m== 9 || *m== 11){
                t=30; *d = 30;
            } else if( *m==2){
                t=28; *d = 28;
            }
            return t;
    
    
        }
        return 0;
    }
    
    int rightValue(int *m, int *d){
        //d의 범위는 1부터 31까지 올 수 있다.
        //m의 범위는 1부터 12까지 올 수 있다.
    
        //m을 통해 값이 어떤값을 나오게 할지 판단할 수 있다.
    
        //d가 28인데 m이 2인경우
        //d가 28인데 m이 2가 아닌 경우
        //d가 30인데 m이 4, 6, 9, 11인 경우
        //d가 31이면 무조건 1
        //그밖에는 무조건 d+1을 리턴
    
        if(*d == 28 && *m==2){
            *m=3; *d=1;
            return 1;
        } else if (*d== 28 && *m != 2){
            *d=29;
            return 29;
        } else if (*d== 30 && (*m==4||*m==6||*m==9||*m==11)){
            *d = 1; *m= *m+1;
            return 1;
        } else if( *d==31){
            *d=1; *m = *m+1;
            return 1;
        } else {
            *d = *d+1;
            return *d;
        }
    
        return 0;
    }
    
    int main(int argc, char** argv)
    {
        int test_case;
        int T;
    
        cin >> T;
        for(test_case = 0; test_case < T; test_case++)
        {
            int m;
            int d;
            char day[10];
    
            cin>>m>>d;
            scanf("%s", day);
    
            // 시작은 일요일부터이다. 일 월 화 수 목 금 토
            // 1, 3, 5, 7, 8, 10, 12는 31일이고 2월은 28일, 4, 6, 9, 11은 30일까지입니다.
            // Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday 
            int k=0;
            if(day[0] == 'S' && day[1] == 'u'){
                k=0;
            } else if(day[0] == 'M'){
                k=1;
            } else if(day[0] == 'T' && day[1] == 'u'){
                k=2;
            } else if(day[0] == 'W'){
                k=3;
            } else if(day[0] == 'T' && day[1] == 'h'){
                k=4;
            } else if(day[0] == 'F'){
                k=5;
            } else {
                k=6;
            }
    
            int arr[7] = {0,0,0,0,0,0,0};
            arr[k] = d;
            if(k==6){ //토요일
                for(int i=k; i>0; i--){
                    arr[i-1] = leftValue(&m, &d);
                }
            } else if(k==5){ //금요일
                arr[k+1] = rightValue(&m, &d);
                for(int i=k; i>0; i--){
                    arr[i-1] = leftValue(&m, &d);
                }
            } else if(k==4){ //목요일
                int leftD = d;
                int rightD = d;
                for(int i=k; i>0; i--){
                    arr[i-1] = leftValue(&m, &leftD);
                }
                for(int i=4; i<6; i++){
                    arr[i+1] = rightValue(&m, &rightD);
                }
            } else if(k==3){ //수요일
                int leftD = d;
                int rightD = d;
                for(int i=k; i>0; i--){
                    arr[i-1] = leftValue(&m, &leftD);
                }
                for(int i=3; i<6; i++){
                    arr[i+1] = rightValue(&m, &rightD);
                }
            } else if(k==2){ //화요일
                int leftD = d;
                int rightD = d;
                for(int i=k; i>0; i--){
                    arr[i-1] = leftValue(&m, &leftD);
                }
                for(int i=2; i<6; i++){
                    arr[i+1] = rightValue(&m, &rightD);
                }
            } else if(k==1){ //월요일
                int leftD = d;
                int rightD = d;
                for(int i=k; i>0; i--){
                    arr[i-1] = leftValue(&m, &leftD);
                }
                for(int i=1; i<6; i++){
                    arr[i+1] = rightValue(&m, &rightD);
                }
            } else if(k==0){ //일요일
                for(int i=0; i<6; i++){
                    arr[i+1] = rightValue(&m, &d);
                }
            }
    
            for(int i=0; i<7; i++){
                cout<<arr[i]<<" ";
            } cout<<endl;
    
    
    
    
        }
    
        return 0;
    }
    

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

    저도 모든 경우를 테스트 해봤는데 같은 일이 반복해서 출력되는 경우가 몇개 보입니다.


    8년 전 link
  • skylife927
    skylife927

    답변감사합니다. 같은 일이 반복되는 예제케이스를 찾는 것도 일이네요.
    1차 멘붕.. ㅋ


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