이에 해당하는 문제는 10952번, 10951번, 1110번으로 총 세문제다. 10951번이 10952번보다 더 나중 순서로 문제가 등록되어있는데, 그 이유를 곧 뼈저리게 느꼈다.
10951번에서 어리버리 타다가 시간을 엄청 뺏겼다. 정답률도 왜 낮은지 알겠더라.. 이번 글에서는 10951번만 다루고자 한다.
아무것도 생각안하고 10951번을 풀다가는 정말 영문을 모르고 틀렸다는 문구만 내내 받을 수 있다. 해당 문제의 설명에는 EOF에 대해 알아보라는 말이 있다. 나는 이걸 읽긴 했는데도, 입력에 대한 프로그램의 흐름을 생각을 1도 안했는지, 아니면 그냥 아무생각이 없었던건지 여튼 굉장히 틀려대다가 겨우 맞췄다. 짜증이 나서 C/C++두 가지 경우로 모두 풀어봤다.
▶︎ C++
#include <iostream>
using namespace std;
int main()
{
int a, b;
while(1)
{
cin >> a >> b;
if(cin.eof())
break;
else
cout << a+b << endl;
}
return 0;
}
나중에 또 얼타면서 헷갈려하다가 틀리지 않기 위해 열심히 메모하겠다. while문 안에서 cin으로 a와 b의 값을 받아본다. 나는 EOF가 -1의 값인것임을 알고있었다는 이유로, 처음에는 a에 값에 -1이 들어가면 break 하라는 말도안되는 코딩을 했다... 값이 -1로 들어갈 수도 있는것인데 말이야.. 여튼 cin >> a >> b 를 통해 두 정수 값을 받아보는데, 만약 이 과정에서 eof 값이 (Ctrl+z) 입력되었다면 cin은 입력 값이나 갯수에 상관없이 EOF를 뿜을 것이고, 이를 cin.eof함수를 통해 검사하는 흐름이다. 참고로 위 순서가 굉장히 중요하다. 입력받아보고, 검사.
▶︎ C
#include <stdio.h>
int main()
{
int a, b;
while(1)
{
int key = scanf("%d %d", &a, &b);
if(key==EOF)
break;
else
printf("%d\n", a+b);
}
return 0;
}
함수만 다르지 C도 C++과 동일하다. 여기선 scanf함수를 통해 입력을 받는 도중 EOF 값이 입력된다면 scanf는 곧바로 EOF를 뿜을 것이다.
파일 입출력으로 봤을때, 입력 스트림 함수들이 파일을 읽다가 파일의 끝(=EOF)을 만나면 즉시 EOF를 뿜는 현상과 동일한 작용이다.
짜증났던 만큼 열심히 메모했다. 중요한 사항인데 많이 어버버 한 것 같아서 스스로에게 분하다...