ACM 온라인예선 연습문제 A번

  • 설지
    설지

    안녕하세요 ACM을 참가해본 적이없어서 이런 채점 방식이 생소한 학생입니다.. ㅜㅜ
    이번에 1주년 모의고사도 참여했는데 한문제도 못풀었어요.. 오늘 예비소집에 문제가 나온거중에..
    소문자와 스페이스로 구성된 문자열 2개를 비교하는 문제가 나와서 풀어봤는데..
    모조리 Wrong Answer 이 나오는군요 ㅜㅜ;;
    혹시 입력받는 변수의 크기를 1024로 고정시켜놔서 그런건가요??
    흠.. 한줄에 입력한다고해서.. 이거 벗어나진 않을거같고..
    처음에는 단순하게 strcmp 를 이용해서 0이 리턴되면 Y 아니면 N 을 출력하게해도 틀리고..
    제가 함수 하나 만들어봐서 올려도 틀리네요..
    왜틀린지 이유를 알고싶어요 ㅜㅜ;;
    아래는 소스입니다.

    #include <stdio.h>
    bool cmpstr(char str1[1024], char str2[1024]);
    int main()
    {
     int T;
     char buf1[1024], buf2[1024];
     scanf("%d", &T);
     fflush(stdin);
     while(T--)
     {  
      gets(buf1);
      gets(buf2);
      if(cmpstr(buf1, buf2))
       printf("Y\n");
      else
       printf("N\n");
     }
     return 0;
    }
    bool cmpstr(char str1[1024], char str2[1024])
    {
     int strlen1, strlen2;
     int i;
     strlen1 = strlen2 = 0;
     for(i = 0; str1[i] != NULL; i++)
     {
      strlen1++;
     }
     for(i = 0; str2[i] != NULL; i++)
     {
      strlen2++;
     }
     if(strlen2 != strlen1)
      return false;
     for(i = 0; i < strlen1; i++)
     {
      if(str1[i] != str2[i])
       return false;
     }
     return true;
    }
    
    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    15년 전
8개의 댓글이 있습니다.
  • 바아보오
    바아보오

    일단 fflush(stdin)은 undefine입니다.
    표준입력을 flush하게되는데, 입력이 표준입력으로(redirection)으로 들어가기 때문에 다음 입력들이 전부 없어지게 됩니다. 따라서 답은 하나만 처리하거나 할 것입니다.


    15년 전 link
  • 설지
    설지

    음.. fflush(stdin)을 해주지않으면 scanf 뒤에 gets가 한번 그냥 넘어가 버려서요..
    그거때문에 넣었는데 그게 문제가 되는거인가요? 흠.. 안써주면 하나 넘어가는데 어떻게 해결하지 음 -"-


    15년 전 link
  • Taeyoon_Lee
    Taeyoon_Lee

    제가 fflush를 안 써봐서 잘 모르겠습니다만 아마 이렇게 하면 될 겁니다.
    scanf("%d", &T);
    gets(buf1);
    while(T--)
    {

    gets(buf1);
    gets(buf2);


    15년 전 link
  • 설지
    설지

    흐흠.. 서버가 느려서 30분 연장시켜줬길래 submit 해봤는데.. 해도 20분동안 NEW 상태임.. -_-;; 넘 느리네요 휴..
    문제 꼭 해결하고싶은데.. ㅁㅊㅁㅊ


    15년 전 link
  • 태태태
    태태태

    아~ 회원가입 안하고 보다가 리플달라고 회원가입하게됫네요 ㅋㅋㅋ
    scanf 를 하고 엔터를 치면 이 엔터값을 다른곳에 저장을 시켜줘야 하죠
    따라서 코드를
    scanf(----)
    getchar();
    while(---)
    {
    gets()
    gets()
    }
    이해하셧어요?ㅎ


    15년 전 link
  • Being
    Being

    제 경우는 위와 같이 scanf와 gets를 혼용해야 할 경우가 생긴다면, 모든 입력을 gets로 받습니다. (이게 컴파일러/플랫폼마다 사소하게 달라서 말이죠... 확실하면 비껴갈 방법이 다 있는데)
    모든 입력을 gets로 받고, scanf를 사용할 자리에 sscanf를 사용하는 것을 추천합니다.


    15년 전 link
  • Being
    Being

    답이 잘 안 나오시면 데이터를 적당히 손으로 만들어서 넣은 뒤 올바르게 나오는지 확인해보시는 걸 추천합니다. emoticon


    15년 전 link
  • holicbaby
    holicbaby

    처음에 몇개받을지 입력받지 않습니까? 그거덕분에 버퍼상에 엔터키가 올라간상태죠 gets는 그걸 인식해 버려서 처음 입력에 무시를 하게 됩니다. 저도 fflush(stdin)을 써보려 했지만 2005에서는 다른식으로 사용되는거 같아 사용하지 못했죠,,,ㅋㅋ 그래서 저는
    if(맨처음입력의경우){
    gets(buf1);
    }
    gets(buf1);
    gets(buf2);
    이러한 방식으로 처리하여 입력을 받았습니다.
    아무래도 디버깅해보시는게 좀더 빠를꺼같습니당


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