이번 문제는 몇 개를 입력 받는지 알 수 없다
다음과 같이 풀었고 출력 초과가 떴다
내가 푼 틀린 코드 ⬇️
#include <iostream>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int a, b;
while (true) {
cin >> a >> b;
cout << a+b << "\n";
}
return 0;
}
10951번 문제처럼 주어진 입력 파일만 갖고 입력을 받을 때 더 이상 읽을 수 있는 데이터가 없는 경우, 즉 파일의 끝일 때 이를 EOF(End Of File) 이라고 한다
위 문제를 본다면 입력에서 더 이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것이다
참고로 엔터도 하나의 문자다 (아스키 코드에 그렇게 설정되어 있다고 한다)
아무튼 입력 스트림이 더 이상 읽을 것이 없는 파일의 끝에 도달했을 때를 처리해야 한다는 것이다
여기서 주의해야 할 점은 파일의 끝까지 읽었다고 EOF 가 되는 것이 아니며 끝까지 읽고 난 뒤 그 다음 파일을 읽으려 할 때 읽을 데이터가 없을 때 EOF 가 되는 것이다
예를 들어 이렇다
abcd<EOF>
즉, 단순히 d 까지 읽었다고 EOF 가 되는 것이 아니라 끝에 도달한 후 더 읽으려고 할 때 EOF 가 된다고 보면 된다
코드로 알아보자
방법 1. scanf
scanf 의 경우 int 반환값이 존재한다
while(scanf("%d %d", &a, &b) != -1) {}
만약 데이터를 읽는 동안 파일의 끝(EOF)에 도달한 뒤 읽고자 하면 -1 을 반환한다
방법 2-1. cin.eof()
cin 의 경우, cin 도 마찬가지로 EOF 를 발생시키는데, 크게 두 가지 방식이 있다
일단 eof() 함수를 쓰는 경우다.
마찬가지로 eof() 함수도 파일의 끝에 도달한 뒤 읽고자 할 경우 true 를 반환한다
while(!(cin >> a >> b).eof()) {}
위와 같이 작성해야 한다
eof() 는 "읽기 시도를 한 후" 에 eof 검사를 한다
그래서 (cin >> a >> b).eof() 방식으로 괄호 안의 cin >> a >> b 를 통해 읽은 후 eof 상태인지 검사한다
방법 2-2. cin
eof() 쓰는 방식이 아닌 더욱 간단한 방식도 있다
while(cin >> a >> b) {}
보통은 cin >> a >> b 를 읽은 후 스트림 객체가 반환되지만, 위처럼 조건문 안에 있는 경우 연산자 오버로딩에 의해 bool 값으로 true 혹은 false 값을 반환한다 (stream 이 정상 상태면 true, 아닐 경우 false)
결과적으로 cin 을 통한 방식과 scanf 방식 모두 "읽은 뒤 EOF 체크" 를 해야 한다는 점이 포인트이다
백준 10951번 정답 코드는 다음과 같다
방법 1. scanf
#include <cstdio>
int main(int argc, const char * argv[]) {
int a, b;
// 또는 scanf("%d %d", &a, &b) == 2 로도 가능
while(scanf("%d %d", &a, &b) != -1) {
printf("%d\n", a + b);
}
return 0;
}
방법 2-1. cin.eof()
#include <iostream>
using namespace std;
int main(int argc, const char *argv[]) {
int a, b;
while (!(cin >> a >> b).eof()) { // 혹은 eof() 대신 fail()을 사용해도 된다.
cout << a + b << "\n";
}
return 0;
}
방법 2-2. cin
#include <iostream>
using namespace std;
int main(int argc, const char *argv[]) {
int a, b;
while (cin >> a >> b) {
cout << a + b << "\n";
}
return 0;
}
참고 블로그
https://st-lab.tistory.com/257
'🏃♀️ 코테 연습' 카테고리의 다른 글
[C++] 문자열 문법 정리 (0) | 2023.02.23 |
---|---|
[C++] 백준 15552번 (0) | 2023.02.08 |
27. N!의 표현법 (0) | 2021.06.23 |
26. 말아톤 (0) | 2021.06.19 |
스터디 1일차 (0) | 2021.06.17 |