hbk388   3년 전

각 테스트케이스를 입력받을때,

scanf(" %s",&arr[1]); 으로 입력을 받으면 정답이 나오는데

fgets(&arr[1], sizeof(arr), stdin); 을 쓰게되면 틀렸습니다가 뜹니다.

왜 그런지 정말 궁금합니다.

djm03178   3년 전

그렇게만 말씀하시면 알 수가 없습니다. 전체 코드를 봐야 합니다. 지금 상태로는 arr의 타입조차 알 수가 없습니다.

hbk388   3년 전


두 코드중에 다른부분이 딱 두군데 있습니다. 주석으로 달아놓겠습니다.


<틀린 코드>

#include <stdio.h>
char arr[500];
int st = 1, wrong;
int main(void)
{
int TC;
scanf("%d ", &TC);
for (int tc = 1; tc <= TC; tc++)
{
fgets(&arr[1], sizeof(arr), stdin); // 이부분
wrong = 0;
st = 1;
for (int i = 1;; i++)
{
if (arr[i] == '\n') break; // 이부분
if (st == 1)
{
if (arr[i] == '1' && arr[i + 1] == '0' && arr[i + 2] == '0')
{
st = 2;
i += 2;
continue;
}
else if (arr[i] == '0' && arr[i + 1] == '1')
{
i++;
continue;
}
else
{
wrong = 1;
break;
}
}

if (st == 2)
{
if (arr[i] == '0')
continue;
if (arr[i] == '1')
{
st = 3;
continue;
}
}

if (st == 3)
{
if (arr[i] == '1' && arr[i + 1] == '0' && arr[i + 2] == '0')
{
i++;
st = 2;
continue;
}
else if (arr[i] == '0' && arr[i + 1] == '1')
{
i++;
st = 1;
continue;
}
else if (arr[i] == '1')
continue;

else
{
wrong = 1;
break;
}
}
}
if (wrong == 0 && st != 2)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

<맞은 코드>

#include <stdio.h>
char arr[500];
int st = 1, wrong;
int main(void)
{
int TC;
scanf("%d\n", &TC);
for (int tc = 1; tc <= TC; tc++)
{
scanf(" %s",&arr[1]); //이 부분
wrong = 0;
st = 1;
for (int i = 1;; i++)
{
if (arr[i] == 0) break; //이 부분
if (st == 1)
{
if (arr[i] == '1' && arr[i + 1] == '0' && arr[i + 2] == '0')
{
st = 2;
i += 2;
continue;
}
else if (arr[i] == '0' && arr[i + 1] == '1')
{
i++;
continue;
}
else
{
wrong = 1;
break;
}
}

if (st == 2)
{
if (arr[i] == '0')
continue;
if (arr[i] == '1')
{
st = 3;
continue;
}
}

if (st == 3)
{
if (arr[i] == '1' && arr[i + 1] == '0' && arr[i + 2] == '0')
{
i++;
st = 2;
continue;
}
else if (arr[i] == '0' && arr[i + 1] == '1')
{
i++;
st = 1;
continue;
}
else if (arr[i] == '1')
continue;

else
{
wrong = 1;
break;
}
}
}
if (wrong == 0 && st != 2)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

djm03178   3년 전

fgets는 개행이 나올 때까지가 아니라 주어진 크기를 다 채우거나 파일의 끝을 만날 때까지 전부 읽어들이므로 매 케이스마다 읽으려고 해서는 안 됩니다.

hbk388   3년 전

Visual studio 에서는 문제없이 테스트케이스가 잘 나왔었는데 그러면 컴파일러의 차이로 발생하는건가요??

djm03178   3년 전

아, 제가 fgets를 fread로 착각했네요. fgets는 줄 단위로 받는 것이 맞습니다.

문제를 다시 찾아볼게요.

djm03178   3년 전

데이터가 잘못된 것으로 보입니다. 어딘가에 개행 문자가 없는 데이터가 있는 것 같습니다.

arr[i] == '\n' || arr[i] == 0으로 바꾸면 fgets로도 맞습니다.

hbk388   3년 전

우와... 그런것까지 파악하시다니 대단하시네요ㅠㅠ

 정성스럽게 답변해주셔서 감사합니다!!!

댓글을 작성하려면 로그인해야 합니다.