[C++] 백준 3단계 - 10951번 문제자료구조 & 알고리즘/BOJ2023. 3. 28. 00:01
Table of Contents
문제설명
소스코드
#include <iostream>
using namespace std;
int main() {
int a, b;
while (!(cin >> a >> b).eof()) cout << a + b << "\n";
}
풀이
이 문제의 핵심 포인트는 입력이 몇 개인지 정해지지 않았다는 것이다.
파일의 끝에 도달했을 때 즉, 더이상 읽을 수 있는 데이터가 없는 경우를 EOF(End Of File)이라고 한다.
입력 스트림이 더이상 읽을 것이 없는 파일의 끝에 도달했을 때 처리를 해야 한다는 것이다.
파일의 끝까지 앍었다고 EOF가 되는 것이 아니라 끝까지 읽고난 뒤 그다음 파일을 읽으려 할 때 읽을 데이터가 없을 때 EOF가 되는 것이다.
cin은 EOF를 발생시키는데 eof()함수는 파일의 끝에 도달한 뒤 읽고자 할 경우 true를 발생시킨다.
while(!cin.eof()) {
...
}
이렇게 코드를 작성하면 틀린다.
char val;
while(!cin.eof()) {
cin >> val;
cout << val;
}
이렇게 코드가 작성되어있고 a, b ,c ,d를 입력한다고 하면
위와 같이 되어 결과적으로 abcdd 출력이 되어버린다.
cin에서 EOF가 되면 더 이상 내부 스트림 상태를 fail로 두고 val 변수에 값을 저장하지 않는다. 즉, val의 상태는 이전 루프의 값을 갖고 있게 되는 것이다.
즉, eof() 가 우리가 원하는 올바른 시점에 true가 되려면 "읽기 시도를 한 후"에 eof 검사를 해야 한다는 것이다.
그렇기 때문에 (cin >> a >> b).eof() 방식으로 괄호 안의 cin >> a >> b를 통해 읽은 후 eof상태인지를 검사하는 것이다.
따라서 아래와 같이 소스코드를 작성해야한다.
while(!(cin >> a >> b).eof()) {
...
}
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[C++] 백준 4단계 - 10871번 문제 (0) | 2023.03.28 |
---|---|
[C++] 백준 4단계 - 10807번 문제 (0) | 2023.03.28 |
[C++] 백준 3단계 - 10952번 문제 (0) | 2023.03.27 |
[C++] 백준 3단계 - 2439번 문제 (0) | 2023.03.27 |
[C++] 백준 3단계 - 2438번 문제 (0) | 2023.03.27 |