-
#1 (c언어 리뷰 & c++ 기본)2021 ICPC 신촌 여름 알고리즘 캠프 (초급) 2021. 9. 3. 18:50728x90
1. 정수 자료형
자료형 메모리 크기 값의 범위 char 1 byte -128 ~ 127 short
unsigned short2 byte -32,768 ~ 32,767
0 ~ 65,535int
unsigned int4 byte -2,147,483,648 ~ 2,147,483,647
0 ~ 4,294,967,295long long int
unsigned long long int8 byte -9,223,372,036,854,775,808 ~
9,223,372,306,854,775,807
0 ~ 18,446,744,073,709,551,615보통 int 형만 사용 해 왔었는데 많은 자료형이 있어서 상당히 어지러웠습니다.
또 자료형의 공통점은 앞에 unsigned 가 붙으면 음수는 표현하지 못하는것 같습니다.
여기서 알아두면 좋은점(아마도 문제 풀때 좋은것 같다)이 int 형은 -2^31 ~ 2^31-1 대략(2 * 10^9)까지 범위입니다.
또 long long 형은 -2^63 ~ 2^63-1 입니다.
대략 (9 * 10^18)입니다.
2. 실수 자료형
자료형 메모리 크기 값의 범위 유효 자릿수 float 4 byte 1.175494e-38 ~
3.402823e+387자리 double 8 byte 2.225074e-308 ~
1.797693e+30816자리 e는 10의 거듭제곱을 의미한다.
즉, float는 10^-38 ~ 10^38 까지이다.
유효 자릿수란 간단하게 저장가능한 수의 자릿수를 의미한다.
예를 들어 float형에 숫자 12345678을 저장할 때, float는 유효 자릿수가 7이므로 1234567 까지만 저장하고
나머지 숫자 8은 날려버린다. 그렇게 되면 결국 정확한 수를 저장하지 못하는것이다.
실수자료형을 공부할때 꼭 나오는게 부동 소수점입니다.
예를 들어 0.1 + 0.2 =0.3 당연히 맞는것 같지만 컴퓨터에서는 부정확한 표현입니다.
자세한건 링크를 걸어 두었습니다.
3. c++(STL)
아마도 C++을 사용하는 가장 큰 이유가 아닐까 싶습니다.
STL은 Standard Template Library(표준 템플릿 라이브러리)의 약자 입니다.
프로그램에 필요한 자료구조와 알고리즘을 템플릿으로 제공합니다.
종류에는 크게 1. 컨테이너, 2. 반복자, 3. 알고리즘 이 있습니다.
장점에는 크게 다양한 자료구조를 직접 구현하지 않고 함수를 쓰듯이 바로 이용할 수 있다는 점입니다.
물론 stl에서 제공되는 자료구조들은 거의 다 최적화가 이루어져 있다고 합니다.
반면에 단점도 존재합니다. 디버깅을 잡기 어렵습니다. 알고리즘에 사용되는 자료구조들을
함수처럼 사용되니 어디 코드가 문제인지 세세하게 잡기가 어렵습니다.
따라서 stl을 편리하고 안전하게 사용하기 위해서는 꼭 stl에 있는 자료구조들이 어떻게
돌아가는지 숙지한 다음에 사용하는게 좋습니다.
3-1 컨테이너(container)
임의 타입의 객체(원소)들을 보관하는 저장소 입니다.
크게 순차컨테이너, 연관컨테이너, 컨테이너 어댑터가 있습니다.
순차 컨테이너(vector, list, string, deque 등)는 쉽게 배열같은 구조를 생각하면 됩니다.
말 그대로 원소들이 순서대로 저장되는 형태입니다.
연관 컨테이너(set, map, multiset, multimap 등) 는 원소들이 관계에의해서 저장됩니다.
예를 들어 어떤 원소가 들어오면 원래있던 원소의 위치가 바뀔 수 도 있습니다.
컨테이너 어댑터(stack, queue, priority_queue 등)
컨테이너 별로 유용한 함수들이 존재합니다.
3-2 알고리즘(algorithm)
컨테이너의 원소들을 조작할 수 있는 함수들의 모임입니다.
주요 알고리즘에는 검색, 정렬, 수정, 개수 세기 등이 있습니다.
주로 반복자 또는 포인터로 작업할 원소를 가리킵니다.
c++알고리즘 함수는 너무 많아 링크로 걸어두겠습니다. 모두 쓰면 좋겠지만 보통 쓰는것들만 쓰는것 같습니다.
4. c++ 벡터(vector)
아마 c에서는 배열을 사용했다면 c++에서는 주로 벡터를 이용합니다.
배열과 벡터의 차이점은 간단히 배열은 정적이지만 벡터는 동적입니다.
다시말해, 배열은 선언과 동시에 크기를 잡고 배열의 크기가 넘어가면 에러를 발생합니다.
반면에 벡터는 선언할때 크기를 설정할 수 도 있고 안할 수 도있습니다.
즉, 원소가 얼마나 들어오든지 즉석으로 크기를 증가시킬수 있습니다. 최적화가 되는것입니다.
벡터를 다루는 방법을 알아보면 먼저 vector<int>v; 라는 것을 먼저 선언합니다.
assign(n,m) : v.assign(n,m) n개의 크기를 m값으로 할당한다는 의미 입니다.
예를 들어 v.assign(5,5)를 하게되면 벡터 v에는 v={5,5,5,5,5} 가 됩니다.
만약 벡터 v의 크기가 k였으면 v.assign(n,m)을 통해 크기가 n으로 바뀝니다.
size() : v.size()는 벡터의 들어있는 원소의 개수를 의미합니다.
return 값은 size_t라는 정수형태이므로 보통 int형으로 안바꿔줘도 무관합니다.
empty() : 벡터의 size()가 0이면 true(1)을 반환해주고 벡터의 사이즈가 양수로 있으면 false(0)를 반환한다.
begin() / end() / rbegin() /rend() : 반복자 개념이 들어갑니다.
v.begin()은 원소를 가리키는게 첫번째 원소를 가리키는 반복자 입니다.
v.end()는 벡터의 마지막원소 다음 위치를 가리키는
반복자 입니다.
v.rend(), v.rbegin()은 뒤집었을때, 사용합니다. 반대가
됩니다.
front() / back() :
v.front()는 벡터의 제일 앞에 있는 원소 입니다. (반복자가 아닙니다! 원소입니다.)
v.back()는 벡터의 맨뒤의 원소입니다.(반복자가 아닙니다! 원소입니다.)
push_back(m) / pop_back() :
v.push_back(m) 은 원소 m을 벡터 v 맨뒤에 넣어주는 기능입니다 v.pop_back()은 벡터 v의 맨뒤의 원소 1개를 제거해줍니다.
resize(n) / resize(n.m) :
만약 벡터 v를 사이즈 5로 선언했다면 v.resize(3)으로 해주면 벡터 사이즈가 3으로 줄어든다
또 예를들어 v.resize(7,10)으로 선언하면 벡터사이즈를 7로 늘리고 그 원소를 10으로 만든다.
insert(iter,m) / insert(iter,k,m) : 원소를 중간에 삽입해줍니다. iter은 반복자가 들어갑니다. 벡터의 사이즈를 늘려주고 삽입을 하기 때문에 시간이 오래걸립니다.
(iter, m)은 iter자리에 m 삽입 / (iter, k, m)은 iter자리에 k개의 m삽입
erase(iter) / erase(start,end) : 벡터의 원소를 삭제해주는 기능입니다. (iter)은 iter자리에 원소를 삭제합니다. (start,end) 는 [start,end) 사이에 있는 원소를 삭제합니다.
벡터의 사이즈도 줄어듬.
min_element / max_element :
벡터의 원소중 가장 크거나 작은 원소를 알려줍니다.
출력을 원할때는 *을 붙여줍니다.
첫째줄은 7출력
둘째줄은 (1,2)중에서 작은값이므로 1출력
셋째줄은 배열 arr중에 가작 작은 원소 1출력
c++은 이밖에도 수많은 기능이 있습니다. 그건 따로 별개로 공부해야 할것 같습니다.
또 멘토님께서 반복자(iterator), set, map, muitiset, multimap, string, next_purmutation, unique, copy, fill, find 를
따로 공부하면 좋을것 같다고 추천 해주셨습니다.
이번 캠프에서 배운것을 복습을 끝낸후 공부할 생각입니다.
'2021 ICPC 신촌 여름 알고리즘 캠프 (초급)' 카테고리의 다른 글
#5 동적 계획법 (DP) (0) 2022.01.15 #4 Brute Force & Backtracking (0) 2022.01.05 #3 Stack, Queue, Deque (0) 2021.09.14 #2(시간 복잡도 & 정렬) (0) 2021.09.08 #0 신촌 여름 알고리즘 캠프(초급) 첫 시작 (0) 2021.09.01