🏃‍♀️ 코테 연습

[C++] 백준 10951번

ji-hyun 2023. 2. 10. 23:28

이번 문제는 몇 개를 입력 받는지 알 수 없다

다음과 같이 풀었고 출력 초과가 떴다

 

 

내가 푼 틀린 코드 ⬇️

 

#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

 

[백준] 10951번 : A + B - 4 - [C++]

https://www.acmicpc.net/problem/10951 10951번: A+B - 4 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 이 전 문제인 A+B - 5와 문제가 같아보이나 이 번 문제는 유의해

st-lab.tistory.com

 

 

 

 

'🏃‍♀️ 코테 연습' 카테고리의 다른 글

[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