PS/백준

[백준/Baekjoon]<10951번> A+B - 4 [C/C++/Python][Class 1]

DigIT_JHB 2022. 7. 15. 20:17

백준 10951번 A+B-4

문제

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

입력

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

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

출력

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

예제 입력 1

1 1
2 3
3 4
9 8
5 2

예제 출력 1

2
5
7
17
7

 

#문제 풀이 방법

 

1. 테스트 케이스 마다 A,B를 입력받고 A+B 출력한다.

2. 더 이상 입력이 되지 않으면 프로그램을 종료시킨다!

 

주의점!

-결국 더 이상 읽을 수 있는 데이터가 존재하지 않는다는 것을 파악하기 위해 EOF(End Of File)을 이용해야한다.

 

 

#C1. C의 경우 대부분 입력할 때 scanf 함수를 이용한다.

2. scanf() 함수는 반환 값이 존재한다. 이 함수는 데이터를 읽어들여 성공적으로 채워진 인자 목록의 개수를 반환한다. 따라서 읽기 오류 또는 EOF 등으로 인해 예상 개수보다 작을 수도 있는 것이다. 

   →Ex) scanf("%d %d",&a,&b); 라고 했을 때, 예상한 대로 2개의 인자에 알맞게 입력되면 2를 반환하는 것이다. 

3. scanf()는 EOF에 도달하면 -1를 반환한다. 

#include <stdio.h>
int main(){
    int a, b;    
    while(scanf("%d %d",&a,&b)!=-1){
        printf("%d\n",a+b);
    }
    return 0;
}
 

#C++

1. C++의 경우 입력할 때 cin을 많이 이용하게 된다.

 

2-1. cin()은 cin 객체를 반환하게 되는데, iostream 내에 이를 bool 또는 다른 타입으로 변환하는 conversion operator가 정의되어있다.

3-1. if나 while, for문을 사용할 경우에는 conversion operator가 암묵적으로  bool type으로 변환하게 된다. 평소에는 operator가 작동하지 않으며 원할 경우 static_cast<bool>(std::cin>>a);로 해야 bool type으로 변환이 된다.

4-1. bool type을 이용하여 문제를 푼다.

#include <iostream>
using namespace std;
int main()
{
	int a, b;
	while (cin >> a >> b)
	{
		cout << a + b << endl;
	}
    return 0;
}

2-2. cin의 멤버함수 중에는 cin.eof()가 있다.

2-3. eof를 판단해서 true, 또는 false를 반환하게 된다. 이를 이용한다.

#include <iostream>
using namespace std;
int main(){
    int a, b;    
    while(1){
        cin >> a >> b;
        if(cin.eof()) break;
        else cout << a+b << endl;
    }
    return 0;
}

 

#Python

1-1. 파이썬 내장함수 input()을 사용하게 되면, EOF일 경우 EOFError 런타임 에러가 발생하게 된다.

2-1. 따라서 런타임에러를 위해 예외처리를 할 수 있다. (Try, except를 이용한다!)

while True:
    try:
       A, B = map(int, input().split())
       print(A + B)
    except EOFError:
        break

1-2. 파이썬에서 입력을 받는 함수 중에 sys 모듈에 있는 stdin을 사용한다.

(sys모듈은 인터프리터에 의해 사용되거나 유지되는 일부 변수와 인터프리터와 강하게 상호 작용하는 함수에 대한 액세스를 제공한다.)

(sys.stdin은 인터프리터가 표준입력에 사용하는 파일 객체이다. stdin은 모든 대화식 입력에 사용된다.)

 

1-2-1. 파일 객체 stdin 의 메소드 중 하나인 sys.stdin.readline()은 입력을 읽을 때 한 번에 한 줄씩 읽는다. 이 함수는 EOF일 경우 빈 문자열을 반환하게 된다. 따라서 이를 이용하여 푼다. 

import sys

while True:
    l=sys.stdin.readline()// 한 줄 받고
    if not l://빈 문자열일 경우
        break
    A,B=map(int,l.split())//빈 문자열이 아닐 경우 분리해서 A,B에 정수로 저장
    print(A+B)

 

 

1-2-2. sys.stdin개행문자까지 입력되며, EOF일 경우 종료된다. 이를 이용해 풀 수 있다.

import sys
for l in sys.stdin:
    A,B=map(int,l.split())
    print(A+B)

 

 

(cf. sys.stdin.readline()도 위에 있는 1-2-2처럼 풀면 ValueError 런타임오류가 발생하게 된다.

import sys

while True:
    A,B=map(int,sys.stdin.readline().split())//split()때문에 런타임 오류 발생
    if not A:
        break
    print(A+B)

readline()은 EOF일 경우, empty string을 반환하기 때문에 이를 split()하게 되면

'ValueError: not enough values to unpack (expected 2, got 0) ' 오류를 발생시키게 된다.

)

반응형