49
알알알알 알알알 STL 25 기 기기기

[devil's camp] - 알고리즘 대회와 STL (박인서)

Embed Size (px)

Citation preview

Page 1: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘 대회와 STL25 기 박인서

Page 2: [devil's camp] - 알고리즘 대회와 STL (박인서)

목차• 알고리즘이란 ?• 알고리즘 대회 소개• C++ 문법• STL 소개• STL 설명

Page 3: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘이란 ?•명확히 정의된 한정된 개수의 규제나 명령의 집합이며 , 한정된 규칙을 적용함으로써 문제를 해결하는 것

Page 4: [devil's camp] - 알고리즘 대회와 STL (박인서)

잘 모르겠죠 ?

Page 5: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘이란 ?•명령어 모으면 알고리즘•다만 형식적 표현이 필요함 .

Page 6: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘이란 ?•입력 : 외부에서 제공되는 자료가 0 개 이상 존재한다 .•출력 : 적어도 2 개 이상의 서로 다른 결과를 내어야 한다 .( 즉 모든 입력에 하나의 출력이 나오면 안됨 )•명확성 : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한다 .•유한성 ( 종결성 ) : 유한 번의 명령어를 수행 후 ( 유한 시간 내 ) 에 종료한다 .•효율성 : 모든 과정은 명백하게 실행 가능 ( 검증 가능 ) 한 것이어야 한다 .

Page 7: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘 대회 소개•일정한 시간을 가지고 일정한 문제의 알고리즘을 생각하고 해결해 나가게 됨 .•Code Jam, Coder’s High, ACM-ICPC, SCPC 등•초중고등학생 : KOI( 한국정보올림피아드 )

Page 8: [devil's camp] - 알고리즘 대회와 STL (박인서)

강사는 ?•중 3 때 KOI 동상•그 이후로 손 놔서 KOI 전국대회 진출도 못하였다고 ..•CPC 특별상 ( 참가상주나요 with 15 이원준 ,여영호 )•그 외에 별 성과가 ;;

Page 9: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘 대회 소개 – 연습은 어디서 ?

Dovelet Baekjoon On-line Judge

AlgoSpot CodeForce

Page 10: [devil's camp] - 알고리즘 대회와 STL (박인서)

알고리즘 대회 소개 – 언어는 어떤 것을 ?

C C++

Java속도가 느림

Page 11: [devil's camp] - 알고리즘 대회와 STL (박인서)

C++

C 객체지향 프로그래밍일반화 프로그래밍 C++

Page 12: [devil's camp] - 알고리즘 대회와 STL (박인서)

C++ 문법•#include <iostream>•std::cin•std::cout•>>•<<

Page 13: [devil's camp] - 알고리즘 대회와 STL (박인서)

C++ 문법•auto•Range-based for

Page 14: [devil's camp] - 알고리즘 대회와 STL (박인서)

STL 소개•문제로 보여드리지요 .•Dovelet.com -> 10 단계 -Music Notes

Page 15: [devil's camp] - 알고리즘 대회와 STL (박인서)

STL 소개STL O

STL X

Page 16: [devil's camp] - 알고리즘 대회와 STL (박인서)

STL 소개•짜기 어려운 ( 귀찮은 ) 것들을 모두 구현 되어있는 집합체•여러 자료구조와 알고리즘을 가지고 있음 .

Page 17: [devil's camp] - 알고리즘 대회와 STL (박인서)

STL 설명•Standard Template Library•컨테이너 : 데이터를 저장함 .•알고리즘• 함수 이터레이터 -> 거의 안 다룰 예정

Page 18: [devil's camp] - 알고리즘 대회와 STL (박인서)

pair•2 개의 자료를 묶어준다 .•첫번째 자료는 first, 두번째 자료는 second•#include <utility>•3 개 이상이면 걍 구조체로 선언합시다 .

Page 19: [devil's camp] - 알고리즘 대회와 STL (박인서)

pairstd::pair<int, int> p1;std::cout << p1.first << ' ' << p1.second << '\n';p1 = make_pair(1, 2);std::cout << p1.first << ' ' << p1.second << '\n';p1 = std::pair<int, int>(3, 4);std::cout << p1.first << ' ' << p1.second << '\n';std::pair<int, int> p2(5, 6);std::cout << p2.first << ' ' << p2.second << '\n';

Page 20: [devil's camp] - 알고리즘 대회와 STL (박인서)

pair0 01 23 45 6

Page 21: [devil's camp] - 알고리즘 대회와 STL (박인서)

pairstd::pair< std::pair<int,int>, std::pair<int,int>> p = make_pair(make_pair(10,20), make_pair(30,40));

std::cout << p.first.first << ' ' << p.first.second << ' ';std::cout << p.second.first << ' ' << p.second.second << '\n';

10 20 30 40

Page 22: [devil's camp] - 알고리즘 대회와 STL (박인서)

vector•동적 배열이라 생각하면 됨 - 길이 변경 가능•#include<vector>

Page 23: [devil's camp] - 알고리즘 대회와 STL (박인서)

vector( 선언 )std::vector<int> v1;std::vector<int> v2(10);std::vector<int> v3(15, 1);std::vector<int> v4 = {1, 2, 3, 4, 5};

Page 24: [devil's camp] - 알고리즘 대회와 STL (박인서)

vector( 선언 )std::vector<pair<int,int>> v5;std::vector<pair<int,int>> v6 = {{1, 2}, {3, 4}};std::vector<vector<int>> v7;std::int n = 10, m = 20;std::vector<vector<int>> v8(n, vector<int>(m));

Page 25: [devil's camp] - 알고리즘 대회와 STL (박인서)

vector( 활용 )std::vector<int> a = {1, 2, 3, 4, 5};a.push_back(6); // [1, 2, 3, 4, 5, 6]a.push_back(7); // [1, 2, 3, 4, 5, 6, 7]a.pop_back(); // [1, 2, 3, 4, 5, 6]a.pop_back(); // [1, 2, 3, 4, 5]a.pop_back(); // [1, 2, 3, 4]a.clear(); // []a.resize(5); // [0, 0, 0, 0, 0]

Page 26: [devil's camp] - 알고리즘 대회와 STL (박인서)

vector( 활용 )std::vector<int> a = {1, 2, 3, 4};a.push_back(5);std::cout << "size = " << a.size() << '\n';std::cout << "empty = " << a.empty() << '\n';a.clear();std::cout << "size = " << a.size() << '\n';std::cout << "empty = " << a.empty() << '\n';

Page 27: [devil's camp] - 알고리즘 대회와 STL (박인서)

vector( 활용 )std::vector<int> a = {1, 2, 3};std::cout << "front = " << a.front() << ‘\n’;std::cout << "a[1] = " << a[1] << ‘\n’;std::cout << "back = " << a.back() << ‘\n’;

Page 28: [devil's camp] - 알고리즘 대회와 STL (박인서)

deque•vector 와 달리 양방향에서 자료를 넣을 수 있음 .

Page 29: [devil's camp] - 알고리즘 대회와 STL (박인서)

map•key 라는 거랑 value 라는 게 있음 ( 둘이 짝지어서 들어감 .)•a[key]=value

Page 30: [devil's camp] - 알고리즘 대회와 STL (박인서)

mapstd::map<int, int> d1;std::map<int, int> d2 = {{1, 2}, {3, 4}, {5, 6}};std::cout << "d1.size() = " << d1.size() << '\n';std::cout << "d2.size() = " << d2.size() << '\n';

Page 31: [devil's camp] - 알고리즘 대회와 STL (박인서)

mapstd::map<int, int> d1;std::map<int, int> d2 = {{1, 2}, {3, 4}, {5, 6}};d1[10] = 20;std::cout << "d1[10] = " << d1[10] << '\n';std::cout << "d2[1] = " << d2[1] << '\n';std::cout << "d2[3] = " << d2[3] << '\n';std::cout << "d2[5] = " << d2[5] << '\n';std::cout << "d2[2] = " << d2[2] << '\n';

Page 32: [devil's camp] - 알고리즘 대회와 STL (박인서)

mapstd::map<char, int> d;d['c'] = 20;std::cout << "d['c'] = " << d['c'] << '\n';

Page 33: [devil's camp] - 알고리즘 대회와 STL (박인서)

stack•있기는 한데 vector 를 씁시다 .

Page 34: [devil's camp] - 알고리즘 대회와 STL (박인서)

queue•말그대로 queue 입니다 .

Page 35: [devil's camp] - 알고리즘 대회와 STL (박인서)

queuestd::queue<int> q;for (int i=1; i<=5; i++) q.push(i);std::cout << q.front() << ' ' << q.back() << '\n';std::cout << "size = " << q.size() << '\n';std::cout << "empty = " << q.empty() << '\n';

Page 36: [devil's camp] - 알고리즘 대회와 STL (박인서)

priority_queue•#include <queue> 에는 priority_queue 도 있음 .

Page 37: [devil's camp] - 알고리즘 대회와 STL (박인서)

priority_queuestd::priority_queue<int> q;//maxstd::priority_queue<int, vector<int>, greater<int>> q3; //min

Page 38: [devil's camp] - 알고리즘 대회와 STL (박인서)

algorithm•reverse•sort/stable_sort•binary_search•lower_bound/upper_bound•max_element/min_element

Page 39: [devil's camp] - 알고리즘 대회와 STL (박인서)

reverse•reverse(begin, end, value) : [begin, end)의 순서를 역순으로 만든다

Page 40: [devil's camp] - 알고리즘 대회와 STL (박인서)

reversestd::vector<int> a = {1, 6, 3, 2, 4, 5, 7, 9, 3, 8, 10};for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';std::cout<<‘\n’;std::reverse(a.begin(), a.end());for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';

Page 41: [devil's camp] - 알고리즘 대회와 STL (박인서)

sort/stable_sort•sort(begin, end) : [begin, end) 를 < 를 기준으로 정렬한다 .•sort(begin, end, cmp) : [begin, end) 를 cmp 를 기준으로 정렬한다 .

Page 42: [devil's camp] - 알고리즘 대회와 STL (박인서)

sort/stable_sortstd::vector<int> a = {1, 6, 3, 2, 4, 5, 7, 9, 3, 8, 10};for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';std::cout<<‘\n’;std::sort(a.begin(), a.end());for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';

Page 43: [devil's camp] - 알고리즘 대회와 STL (박인서)

sort/stable_sortbool cmp(int u, int v) {return u > v;}

std::vector<int> a = {1, 6, 3, 2, 4, 5, 7, 9, 3, 8, 10};for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';std::cout<<‘\n’;sort(a.begin(), a.end(), cmp);for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';

Page 44: [devil's camp] - 알고리즘 대회와 STL (박인서)

binary_search•binary_search(begin, end, value) : [be-gin, end) 에서 value 를 찾으면 true, 못 찾으면 false

Page 45: [devil's camp] - 알고리즘 대회와 STL (박인서)

lower_bound/upper_bound•lower_bound(begin, end, value)•lower_bound(begin, end, value, cmp)•upper_bound(begin, end, value)•upper_bound(begin, end, value, cmp)

Page 46: [devil's camp] - 알고리즘 대회와 STL (박인서)

lower_bound/upper_boundstd::vector<int> a = {1, 2, 2, 3, 4, 4, 4};for (int i=1; i<=5; i++) {std::cout << i << ": ";std::cout << "lower_bound: " << (std::lower_bound(a.begin(), a.end(), i)-a.begin()) << ' ';std::cout << "upper_bound: " << (std::upper_bound(a.begin(), a.end(), i)-a.begin()) << '\n';}

Page 47: [devil's camp] - 알고리즘 대회와 STL (박인서)

lower_bound/upper_bound1: lower_bound: 0 upper_bound: 12: lower_bound: 1 upper_bound: 33: lower_bound: 3 upper_bound: 44: lower_bound: 4 upper_bound: 75: lower_bound: 7 upper_bound: 7

Page 48: [devil's camp] - 알고리즘 대회와 STL (박인서)

min_element/max_element•min_element(begin, end)•min_element(begin, end, cmp)•max_element(begin, end)•max_element(begin, end, cmp)

Page 49: [devil's camp] - 알고리즘 대회와 STL (박인서)

min_element/max_elementstd::vector<int> a = {4, 2, 1, 5, 7, 3};std::cout << ", 위치 : " << (min_element(a.begin(), a.end())-a.begin()) << '\n';std::cout << ", 위치 : " << (max_element(a.begin(), a.end())-a.begin()) << '\n';