문제 설명
문제 링크: https://www.acmicpc.net/problem/10951
풀이
문제만 읽었을 때는 구체적으로 원하는 것을 명확히 알기 어려웠다. 이 문항이 "단계별로 풀어보기"의 "반복문" 단계에 속해 있다는 것을 확인하고서야 방향을 잡을 수 있었다.
입력이 끝날 때까지 한 번에 두 개씩 정수를 읽어 합을 구한 후 출력하는 문제이다.
입력이 끝나는 시점이 언제인가를 알아낼 수 있다면 문제는 아주 간단하다.
int nReaded = 0, A, B;
while(true){
nReaded = scanf("%d %d", &A, &B);
if (nReaded == 2){
printf("%d\n", A+B);
}
else{
break;
}
}
scanf 함수는 성공적으로 입력받은 데이터의 개수를 리턴하는데, 실패하는 경우 또는 파일의 끝(입력의 끝)에 도달하면 EOF를 리턴한다. C++에서 EOF는 파일의 끝의 약자로 -1로 정의되어 있다.
위의 코드에서는 숫자 두 개씩 입력을 받다가 EOF에 도달하면 함수가 종료한다.
int main() {
int A, B, C;
A = -1, B = -1, C = -1; // 초기화
int a = scanf("%d", &A, &B, &C);
printf("first: %d, A=%d, B=%d, C=%d\n", a, A, B, C);
A = -1, B = -1, C = -1; // 초기화
int b = scanf("%d %d %d", &A, &B, &C);
printf("second: %d, A=%d, B=%d, C=%d\n", b, A, B, C);
A = -1, B = -1, C = -1; // 초기화
int c = scanf("", &A, &B, &C);
printf("third: %d, A=%d, B=%d, C=%d\n", c, A, B, C);
return 0;
}
그럼 위의 코드를 실행하면 결과가 어떻게 될까?
결과는 다음과 같다.
23 45 67
first: 1, A=23, B=-1, C=-1
23 45 67
second: 3, A=23, B=45, C=67
third: 0, A=-1, B=-1, C=-1
첫 번째 테스트에선 한 번만 입력받으므로 1을 리턴한다.
두 번째 테스트에선 세 번 입력받으므로 3을 리턴한다.
세 번째 테스트에선 입력을 받지 않으므로 함수가 바로 리턴한다. 리턴값은 0이다.
결론을 말하자면, 값을 받아오는 변수의 개수가 중요한 것이 아니라, 입력받는 포맷의 개수가 중요하고 이에 따라 리턴값이 변경된다는 것이다.
표준 입력을 처리하는 방법에 관한 더 자세한 설명이 다음 링크에 있습니다. 도움이 되었으면 좋겠습니다.
소스 코드
#include <iostream>
int main() {
int A, B;
int nReaded = EOF;
while(true){
nReaded = scanf("%d %d", &A, &B);
if (nReaded == 2){
printf("%d\n", A+B);
}
else{ // 입력값을 두 개 못 읽거나 EOF에 도달했을 때
break;
}
}
return 0;
}
'문제 풀이 > 백준 (BOJ)' 카테고리의 다른 글
[백준/BOJ] 4134번: 다음 소수 ( 주어진 수에 가장 가까운 소수 찾기 ) - C++ 문제 풀이 (0) | 2024.04.19 |
---|---|
[백준/BOJ] 1181번: 단어 정렬 - C++ 문제 풀이 (0) | 2024.04.17 |
[백준/BOJ] 18870번: 좌표 압축 - C++ 문제 풀이 (0) | 2024.04.16 |
[백준/BOJ] 2798번, 2839번: 브루트 포스 - C++ 문제 풀이 (0) | 2024.04.11 |
[백준/BOJ] 2581번: 소수 - C++ 문제 풀이 (0) | 2024.04.04 |