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분이상 이 문제를 붙들고 있는 경우, 그건 입출력에서 뭔가 모르는 부분이 반드시 있다는 뜻이므로 이전 질문들을 무조건 찾아보고 다른 사람이 푼 코드를 반드시 봐야 한다.
내가 애용하는 IDE 사이트
(IDE 자동 완성이 불가능하기 때문에 사용하는 중)
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에서 검색해보니
여기서 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 |
댓글