int, 4바이트짜리 정수
4바이트짜리 정수를 사용할 때 쓰인다. 약 20억까지 표현할 수 있다.
즉, 문제를 푸는 코드에 들어가있는 값들의 예상값이 20억을 넘어간다면 int가 아닌 long long을 써야 한다.
보통 그리고 int의 최대값으로 20억까지가 아닌 987654321 또는 1e9를 쓴다.
const int INF = 987654321;
const int INF2 = 1e9;
int 연산
int로 선언한 변수 끼리 연산을 하게 되었을 때 실수가 나온다면 소수점 아래에 있는 수는 모두 버림이 된다.
const 키워드
const는 수정할 수 없는 변수를 말한다. 보통 INF나 방향벡터를 나타내는 dy, dx에 const를 쓴다.
예를 들어 문제에서 주어진 맵의 크기가 10 * 10 이기 때문에 10*10 2차원 배열을 만들어야 할 경우
const int mx = 10;
int a[mx][mx];
C++
복사
어짜피 10이라는 숫자는 변하지 않는 상수이기 때문에 미리 설정해놓고 이를 기반으로 맵의 크기를 설정한다.
오버플로
타입의 허용범위를 넘어갈 때 발생하는 에러를 뜻한다. 예를 들어 int타입이라면 2,147,483,647을 넘어간다면 에러가 발생한다.
여기서 만약에 ++ 하면 최솟값인 -2,147,483,647로 간다
언더플로
반대로 취급할 수 있는 결과값보다 작아지게 되면 언더플로가 발생된다.
long long, 8바이트 짜리 정수
int로 표현이 안될 때 쓰면 된다.
double, 실수 타입
8바이트 이며 소수점 아래로 15자리 까지 표현이 가능함.
참고로 실수타입은 float도 있는데 이는 4바이트, 소수점 아래로 7자리까지 표현가능.
double이 더 정확하니까 double 쓰자.
double pi = 3.221;
C++
복사
unsinged long long, 8바이트 짜리 양의 정수
long long 에서 -로 표현할 범위를 몽땅 + 범위에 추가한 타입.
pair 와 tuple
pair와 tuple은 타입이나 자료구조는 아님. C++에서 자주 사용됨.
pair는 first 와 second 라는 멤버 변수를 가지는 클래스이다. 두 가지 값을 담아야 할 때 쓴다.
tuple은 세 가지 이상의 값을 담을 때 쓴다.
tie는 pair이나 tuple로부터 값을 끄집어낼 때 사용되는 함수이다.
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
pair<int, int> pi;
tuple<int, int, int> tl;
int a, b, c;
pi = { 1, 2 };
tl = make_tuple(1, 2, 3);
tie(a, b) = pi;
cout << a << " : " << b << '\n';
tie(a, b, c) = tl;
cout << a << " : " << b << " : " << c << '\n';
return 0;
}
C++
복사
pair의 경우 {a, b} 또는 make_pair(a, b)로 만들 수 있다. 그저 2개의 원소를 담은 바구니를 생각하면 된다.
이때 원래는 a = pi.first, b = pi.second 이런 식으로 끄집어내야 하는데, tie를 쓰면 tie(a, b) = pi 이렇게 끄집어 낼 수 있다.
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
pair<int, int> pi;
tuple<int, int, int> tl;
int a, b, c;
pi = { 1, 2 };
tl = make_tuple(1, 2, 3);
a = pi.first;
b = pi.second;
a = get<0>(tl);
b = get<1>(tl);
c = get<2>(tl);
cout << a << b << c << '\n';
}
C++
복사
tuple의 경우 get<0> 이런 식으로 값을 꺼내야 한다. 3가지 이상의 멤버 변수가 필요하면 보통 struct를 쓰는 게 더 편하다.
auto 타입
auto는 타입 추론을 해 결정되는 타입.
복잡하고 긴 타입의 변수명을 대신하는 간단한 방법이다.
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
vector<pair<int, int>> v;
for (int i = 1; i <= 5; i++) {
v.push_back({ i, i });
}
for (auto it : v) {
cout << it.first << " : " << it.second << '\n';
}
for (pair<int, int> it : v) {
cout << it.first << " : " << it.second << '\n';
}
return 0;
}
C++
복사
타입변환
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
double ret = 2.12345;
int n = 2;
int a = (int)round(ret / double(n));
cout << a << '\n';
}
C++
복사
(바꿀타입) 기존변수
중요한 점은, 같은 타입끼리 연산을 해야한다. double은 double끼리, int는 int끼리 연산하게 타입변환을 해 놓고 연산하자.
int a = (int) p * 100
int a = (int) 100 * p
위에만 타입 변환이 된다.
문자를 숫자로, 숫자를 문자로
int main() {
char a = 'a';
cout << (int)a << '\n';
cout << (int)a - 97 << '\n';
cout << (int)a - 'a' << '\n';
return 0;
}
/*
97
0
0
*/
C++
복사
A~Z는 65~90 / a ~z는 97~122
(int)a는 97.