8 min read

cpp[2] - 입력받기 및 사칙연산

cpp[2] - 입력받기 및 사칙연산

숫자, 문자, 특수문자, 문자열 등을 자유자재로 출력할 수 있게 되었기에, 이들을 입력받아서 활용하는 방법에 대해서 다루도록 하겠습니다.

변수

변수 (Variable)는 수학에서의 x,y,z 와 같은 존재이지만, C++ 언어에서는 박스와 같은 개념으로 이해하는것이 가장 간단합니다. 값이 변할 수 있다는 점은 수학과 동일하지만, 수학과는 다르게 어떤 수식에 의해 종속되어서 y=f(x) 와 같은 표기법을 따르지 않습니다. 원하는 그 어떤 값이던 자유롭게 넣었다 뺐다 할 수 있다는 것이 프로그래밍에서의 변수의 특징입니다.

"박스" 라는 비유를 사용하는 이유는 이러한 변수들이 컴퓨터 메모리 상의 어떤 텅 빈 "공간" 을 사용하기 때문인데, 이에 대해서는 추후 살펴보는 것으로 하고,

숫자와 문자, 문자열에 대한 다양한 표기법이 있는 것과 같이
이러한 표기법에 맞는 종류의 다양한 변수 자료형이 존재합니다.

서로 다른 유형의 값들임을 구분하기 위해 다른 박스를 사용한다고 생각해주시면 이해가 쉬울 것 같습니다.

변수의 선언 방법은 아래와 같습니다.

int var = 5;
//타입명 변수이름 = 값;

int N;
//값을 초기화 하지 않은 경우

int A,B;
//두개 이상의 변수를 동시에 만드는 경우

타입명에는 다음과 같은 종류가 있습니다.
들어가는 값의 종류 별로 분리해서 사용합니다.

  • int INTeger, 정수입니다.
  • long long 보다 큰 정수입니다. 10^9 이상의 수를 다룰 때 사용합니다.
  • float 실수입니다. 컴퓨터에서의 "부동" 소수점 표기에서 유래
  • double 실수입니다. float에 비해 크기가 두배입니다.
  • char CHARacter, 문자 한 글자를 저장합니다.
  • bool BOOLean, True/False를 저장. 논리학자 "조지 부울"에서 유래.

입력문 cin

출력문이 Character OUTput으로 COUT 이었습니다.
입력은 쉽게 예상해보실 수 있듯이
Character INput에서 따와서, cin을 사용합니다.

바로 예제로 보도록 하겠습니다.
cin으로 숫자 하나를 입력받아, 그대로 출력하는 프로그램입니다.

#include <iostream>
using namespace std;

int main(){
	int N;
	cin >> N;
	cout << N;
	return 0;
}

cout은 출력하고 싶은 글자를 화면으로 내보내기에 << 을 사용하지만,
cin은 화면에서의 글자를 가져오기 때문에 >> 화살표를 사용합니다.

또한, 가져온 값을 어딘가에 보관을 해두어야 하기 때문에,
cin으로 가져온 값을 담을 변수를 미리 만들어주셔야 합니다.
위의 소스코드에서는 정수를 담을수 있는 변수 N 을 만들어 사용했습니다.

cin이 하나의 숫자, 문자를 판별하는 기준은 스페이스바와 엔터입니다.
예를 들어, 5 3 이라는 형태로 주어지는 글자를 변수에 넣고 싶다면

#include <iostream>
using namespace std;

int main(){
	int A,B;
	cin >> A;
	cin >> B;
	cout << A + B;
	return 0;
}

와 같이 입력을 두번 받아 사용할 수 있습니다.
A에는 5가,
B에는 3이 들어갑니다.

cout이 축약이 가능했듯이
cin도 화면에서 순서대로 받아와서 넣을 수 있습니다.

#include <iostream>
using namespace std;

int main(){
	int A,B;
	cin >> A >> B;
	cout << A + B;
	return 0;
}

정확히 똑같은 동작을 하는 소스코드입니다.
둘 모두 스페이스바나 엔터로 구분되는 두 숫자를 입력받고,
그 합을 출력합니다.

사칙연산

앞선 몇번의 글에서 + 를 통한 덧셈이 가능하다는 것을 짐작해보셨을듯 합니다. 사칙연산 모두가 가능하기에, boj 10869 사칙연산 문제를 통해
사칙연산에 대해 짚어보도록 하겠습니다.

10869번: 사칙연산
#include <iostream>
using namespace std;

int main(){
	int A,B;
	cin >> A >> B;
	cout << A+B << "\n";
	cout << A-B << "\n";
	cout << A*B << "\n";
	cout << A/B << "\n";
	cout << A%B << "\n";
	return 0;
}

+ - * / 이 네 기호는 각각 덧셈, 뺄셈, 곱셈, 나눗셈에 대응합니다.
마지막 기호인 % 기호는 A/B의 몫이 아닌 나머지가 필요할때 사용합니다.

각각의 연산 결과를 또 다른 변수에 저장할 수도 있습니다.

#include <iostream>
using namespace std;

int main(){
	int A,B,C,D,E,F,G;
	cin >> A >> B;
	
	C = A+B;
	D = A-B;
	E = A*B;
	F = A/B;
	G = A%B;
	
	cout << C << "\n";
	cout << D << "\n";
	cout << E << "\n";
	cout << F << "\n";
	cout << G << "\n";
	return 0;
}

사칙연산의 우선순위

수학 과목에서는 곱셈과 나눗셈 연산이 덧셈보다 우선순위가 높아서, 먼저 계산해야 했었습니다. 컴퓨터에서도 이는 유효하게 작동합니다.

요컨데, 식 5+3*2 의 결과는 11 이 됩니다.
우리가 원하는 결과가 8*2 로 16인 경우, 소괄호() 를 통해
우선순위를 직접 명시해 주셔야 합니다.

수학과 다른 점은, 중괄호{} 와 대괄호[] 각각에 모두 역할이 있기 때문에,
소괄호를 계속 겹쳐서 우선순위를 표기할 수 있습니다.

(5+3)*((5-1)/2) 이 유효한 식이고, 그 결과는 16으로 계산됩니다.

fastio

Fast I/O
그 누구보다 빠르게

fastio에 대해 깊게 정리되어있는 글입니다.
이렇게까지 깊게 탐구할 필요는 없고, 핵심이 무엇이냐 묻는다면

  • C++의 "입출력" 은 타 언어에 비해 느리다
  • 이로 인해 시간초과 를 받을 수 있다
  • 입출력을 보다 빠르게 해주는 기능이 있다.

기본적으로 C++이 입출력이 느린 이유는 오래된 C 프로그램과의 호환성을 위한 것이기 때문에, 우리에게는 불필요합니다.

cin.sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

이 세개의 구문을 통해 호환성을 끊어내고, 속도를 빠르게 할 수 있습니다.
전체 소스코드는 아래와 같습니다.

#include <iostream>
using namespace std;

int main(){
	cin.sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	int N;
	cin >> N;
	cout << N;
	return 0;
}

실험 결과가 간단히 위의 출처에 기입되어있어 첨부.

결론

각 유형에 맞게 변수를 만들고, 그 변수에 입력을 받아 계산하는 과정을 배워보았고, 이를 활용하면 solved ac의
문제 > 새싹 > 입력과 계산 단계를 해결할 수 있습니다.

11382번: 꼬마 정민

11382번을 풀때는 입력 숫자의 범위가 10^12로 long long 형을 사용해야 함에 유의해야 합니다.

25311번: UCPC에서 가장 쉬운 문제 번호는?

긴 지문에 익숙해질 수 있도록 25311번도 풀어보시길 권장드립니다.