2010 프로야구 문제에 대한 질문입니다.

  • JJackS
    JJackS

    BASEBALL

    '승률 = 승수 / 경기수'로 정의하고 있습니다.
    일반적으로 경기를 하게 되면, 승무패로 승점제를 도입하죠.

    이 문제에서는 무승부나 패배를 하면 승률에는 동일한 결과를 줍니다.
    (ex) 9승 1무 0패 == 9승 0무 1패
    승률 0.9 승률 0.9

    그리고 4위 안에 응원팀이 존재하는지 결정할 때는
    응원팀의 승률보다 높은팀이 3팀이하로 존재하면, 포스트시즌에 진출할 수 있다고 생각했습니다.(승률이 동률이어도, 카운트를 하지 않으니까요)

    제가 생각한 것에 문제점이 있는지 궁금합니다.

    #include<stdio.h>
    //#include<stdlib.h>
    #include<string.h>
    
    typedef struct team{
     char name[21];
     int win;
     int draw;
     int defeat;
     double rank;
    }team;
    team team_data[8];
    
    typedef struct game{
     char team_a[21];
     int  index_a;
     char team_b[21];
     int  index_b;
    }game;
    game game_data[25];
    
    int main(){
     int case_num, i=0,j=0, m=0, n=0, k=0;
     int R, myteam_i;
     char myteam_name[21] = {0, };
     scanf("%d", &case_num);
     while(i< case_num){
         m=0;
         memset(myteam_name, 0, sizeof(myteam_name));
         memset(team_data, 0, sizeof(team_data));
         memset(game_data, 0, sizeof(game_data));
      //입력
      for(j=0;j<8;j++){
          scanf("%s %d %d %d", team_data[j].name, &team_data[j].win, &team_data[j].draw, &team_data[j].defeat);
          if((team_data[j].win + team_data[j].draw + team_data[j].defeat) != 0){
              team_data[j].rank = team_data[j].win / (team_data[j].win + team_data[j].draw + team_data[j].defeat);
          }
          else team_data[j].rank = 0;
      }
      scanf("%s", myteam_name);
      for(j=0;j<8;j++){
          if(strcmp(myteam_name, team_data[j].name) == 0){
              myteam_i = j;
              break;
          }
      }
      R=0;
      scanf("%d", &R);
      for(j=0;j<R;j++){
          scanf("%s %s", game_data[j].team_a, game_data[j].team_b);
          for(k=0;k<8;k++){
              if(strcmp(game_data[j].team_a, team_data[k].name) == 0){
                  game_data[j].index_a = k;
              }
              if(strcmp(game_data[j].team_b, team_data[k].name) == 0){
                  game_data[j].index_b = k;
              }
          }
      }
      //
      for(j=0;j<R;j++){
              //응원팀 - 항상 이김
              if(myteam_i == game_data[j].index_a){
                  team_data[myteam_i].win++;
                  team_data[game_data[j].index_b].defeat++;
              }
              else if(myteam_i == game_data[j].index_b){
                  team_data[myteam_i].win++;
                  team_data[game_data[j].index_a].defeat++;
              }
              //나머지 경우는 무승부
              else{
                  team_data[game_data[j].index_a].draw++;
                  team_data[game_data[j].index_b].draw++;
              }
      }
      //승률 다시 계산
      for(j=0;j<8;j++){
          if((team_data[j].win + team_data[j].draw + team_data[j].defeat) != 0){
              team_data[j].rank = team_data[j].win / (team_data[j].win + team_data[j].draw + team_data[j].defeat);
          }
          else team_data[j].rank = 0;
      }
    //순위 결정.
      for(j=0;j<8;j++){
          if(j == myteam_i) continue;
          if(team_data[j].rank > team_data[myteam_i].rank) m++;
          if(m >= 4){
              printf("NO\n");
              break;
          }
      }
      if(m < 4) printf("YES\n");
      i++;
     }
     return 0;
    }
    

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

    논리는 맞는것 같은데요. ^^ rank를 구하는 나눗셈에 문제가 있지 안흥ㄹ까 생각해 봅니다.


    10년 전 link
  • JJackS
    JJackS

    감사합니다. ^^
    float와 double이 사용하기가 애매하네요.
    정확한 값을 계산하는게 아니여서 Int로 바꾸고 10000배정도 붙여주니 정상적으로 풀이가 되네요.


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