본문 바로가기
OLD_알고리즘/Baekjoon

백준] 10951 : A+B (4)

by 달승 2020. 7. 10.

BOJ에서 다음 문제들을 쭉 순서대로 풀어본다.  boj.kr/문제번호 <= 형태로 검색하면 된다.

입출력 - 2557, 1000, 2558, 10950, 10951, 10952, 10953, 11021, 11022, 11718, 11719, 11720, 11721, 2741, 2742, 2739, 1924, 8393, 10818, 2438, 2439, 2440, 2441, 2442, 2445, 2522, 2446, 10991, 10992

 

입출력 문제들을 풀 때 10분이상 이 문제를 붙들고 있는 경우, 그건 입출력에서 뭔가 모르는 부분이 반드시 있다는 뜻이므로 이전 질문들을 무조건 찾아보고 다른 사람이 푼 코드를 반드시 봐야 한다.

 

 

알고리즘 문제풀이(PS) 시작하기

이런건 고수들이나 써야 하지 않나 싶지만, 그래도 1년정도 공부하면서 이 분야를 어떻게 시작해야 할지 써보려 한다. 라고 운을 뗀다음 열심히 내 얘기만 했던 후속편이다. 내 인생사가 궁금하�

plzrun.tistory.com

 

 

 

내가 애용하는 IDE 사이트

(IDE 자동 완성이 불가능하기 때문에 사용하는 중)

 

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

ideone.com


 

 

10951번: A+B - 4

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

10950번 : A+B -4

 

 

문제  : 

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력  : 

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력  : 

각 테스트 케이스마다 A+B를 출력한다.

 

 

정답 코드

#include <iostream>
using namespace std;

int main() {
	
	int A = 0, B = 0;

	while (cin >> A >> B){
		cout << A+B << endl;
	}

	return 0;
}

 

 

 

 

!(cin.eof())라는 방법은?

더보기
#include <iostream>
using namespace std;

int main() {
	
	int A = 0, B = 0;

	while (!(cin.eof())){
		cin >> A >> B;
		cout << A+B << endl;
	}

	return 0;
}

IDE에서는 TestCase 다 맞게 나왔는데 백준에선 틀렸다.

 

왜 틀렸는지... 이유를 찾아보자.

아, 생각해보니 틀린 이유를 알 것 같다... 머리로는 뭔가 알겠는데 설명이 어렵넹...

 

틀린 이유에 대해서 더 찾아봤다.

 

입력에서 '입력은 여러 개의 테스트 케이스로 이루어져 있다.'라는 문구를 살펴보고, 아래 답변을 살펴보자.

(1)
모든 파일의 끝에는 우리가 눈으로 볼 순 없지만 EOF라는 표시가 붙어 있습니다. 파일의 끝(End Of File)이란 뜻이죠. cin으로 입력을 받으려 하는데 EOF가 읽히면 입력 받기가 취소되고 cin.eof()가 true가 됩니다.

터미널에서 직접 입력을 넣으실 땐 EOF를 수동으로 넣어주셔야 합니다. 윈도우 기준으로는 Ctrl + Z, UNIX 기준으로는 Ctrl + D입니다. BOJ에서는 입력을 넣을 때 파일로 주기 때문에 EOF가 붙어 있습니다.

출처 : https://www.acmicpc.net/board/view/24867

(2)
만약 파일의 끝을 의미하는 EOF를 읽게 되면, true값으로 바뀌게 된다.

출처 : https://lollolzkk.tistory.com/15

(3)
"여러 개의 테스트케이스로 이루어져 있는" 문제에서는 각 테스트케이스마다 초기화를 합시다.

출처 : https://www.acmicpc.net/blog/view/70

(4)
테스트 케이스에서 종료조건이 없으면 EOF(End Of File) 설정을 해주면 된다.C언어의 경우는 while(scanf("%d %d",&A,&B) !=EOF){} EOF가 아닐 때까지 while문을 반복해주고,C++ 경우는 while(cin >> A >> B) 조건을 넣어주면 된다.

출처: https://yongku.tistory.com/entry/백준-알고리즘BOJ-10951번-AB-4-C [츄르 사려고 코딩하는 집사]

 내 추측으로는 

1. 코드가 아예 틀렸음

2. (3)번의 각 테스트케이스마다 초기화를 해야 한다는 말이 걸림.

     !cin.eof()가 초기화를 안 시켜줄 수도 있을 것 같다는 생각이 듬.

3. 아래 코드는 다른 케이스의 활용으로 정답 코드.

   while(true) {
       cin >> a >> b;
       if(cin.eof() == true) {
        // cin으로 입력받은 값이 없으면
        // cin.eof()는 true를 반환한다. 당연히 그렇지 않으면 false 반환
           break;
       }
       cout << a + b << endl;
   }

 

 

 

............

stackOverflow에서 검색해보니

 

Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

I just found a comment in this answer saying that using iostream::eof in a loop condition is "almost certainly wrong". I generally use something like while(cin>>n) - which I guess implicitly ...

stackoverflow.com

여기서 while(!cin.eof())를 쓸 때, 알게된 사실은

1. eof는 파일의 끝일 경우, ture를 반환한다. 하지만 next read가 stream의 끝을 나타내지 않는다고 한다.

2. 데이터 초기화가 되지 않는 다는 것.

3. C++에서는 while(cin >> data)의 방식을 권장하는 듯하다.

   : data가 초기화 되기 때문에.

 

'OLD_알고리즘 > Baekjoon' 카테고리의 다른 글

백준] 10953 : A+B (6)  (0) 2020.07.10
백준] 10952 : A+B (5)  (0) 2020.07.10
백준] 10950 : A+B (3)  (0) 2020.07.10
백준] 2558 : A+B (2)  (0) 2020.07.10
백준] 1000 : A+B  (0) 2020.07.10

댓글