알고리즘 대회와 STL
25기 박인서
목차
• 알고리즘이란?
• 알고리즘 대회 소개
• C++ 문법
• STL 소개
• STL 설명
알고리즘이란?
•명확히 정의된 한정된 개수의 규제나 명령의 집
합이며, 한정된 규칙을 적용함으로써 문제를 해
결하는 것
잘 모르겠죠?
알고리즘이란?
•명령어 모으면 알고리즘
•다만 형식적 표현이 필요함.
알고리즘이란?
• 입력 : 외부에서 제공되는 자료가 0개 이상 존재한다.
• 출력 : 적어도 2개 이상의 서로 다른 결과를 내어야 한다.(즉 모든 입력에
하나의 출력이 나오면 안됨)
• 명확성 : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한
다.
• 유한성(종결성) : 유한 번의 명령어를 수행 후(유한 시간 내)에 종료한다.
• 효율성 : 모든 과정은 명백하게 실행 가능(검증 가능)한 것이어야 한다.
알고리즘 대회 소개
•일정한 시간을 가지고 일정한 문제의 알고리즘
을 생각하고 해결해 나가게 됨.
•Code Jam, Coder’s High, ACM-ICPC, SCPC 등
•초중고등학생 : KOI(한국정보올림피아드)
강사는?
•중3때 KOI 동상
•그 이후로 손 놔서 KOI 전국대회 진출도 못하였
다고..
•CPC 특별상(참가상주나요 with 15이원준,여영호)
•그 외에 별 성과가;;
알고리즘 대회 소개 – 연습은 어디서?
Dovelet
Baekjoon
Online Judge
AlgoSpot CodeForce
알고리즘 대회 소개 – 언어는 어떤 것을?
C C++
Java속도가 느림
C++
C
객체지향 프로
그래밍
일반화 프로그
래밍
C++
C++ 문법
•#include <iostream>
•std::cin
•std::cout
•>>
•<<
C++ 문법
•auto
•Range-based for
STL 소개
•문제로 보여드리지요.
•Dovelet.com -> 10단계-Music Notes
STL 소개
STL O
STL X
STL 소개
•짜기 어려운(귀찮은) 것들을 모두 구현 되어있는
집합체
•여러 자료구조와 알고리즘을 가지고 있음.
STL 설명
•StandardTemplate Library
•컨테이너 : 데이터를 저장함.
•알고리즘
• 함수 이터레이터->거의 안 다룰 예정
pair
•2개의 자료를 묶어준다.
•첫번째 자료는 first, 두번째 자료는 second
•#include <utility>
•3개 이상이면 걍 구조체로 선언합시다.
pair
std::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';
pair
0 0
1 2
3 4
5 6
pair
std::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
vector
•동적 배열이라 생각하면 됨-길이 변경 가능
•#include<vector>
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};
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));
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]
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';
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’;
deque
•vector와 달리 양방향에서 자료를 넣을 수 있음.
map
•key라는 거랑 value라는 게 있음(둘이 짝지어서
들어감.)
•a[key]=value
map
std::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';
map
std::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';
map
std::map<char, int> d;
d['c'] = 20;
std::cout << "d['c'] = " << d['c'] << 'n';
stack
•있기는 한데 vector를 씁시다.
queue
•말그대로 queue 입니다.
queue
std::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';
priority_queue
•#include <queue>에는 priority_queue도 있음.
priority_queue
std::priority_queue<int> q;//max
std::priority_queue<int, vector<int>, greater<int>> q3; //min
algorithm
•reverse
•sort/stable_sort
•binary_search
•lower_bound/upper_bound
•max_element/min_element
reverse
•reverse(begin, end, value) : [begin, end)의 순서를
역순으로 만든다
reverse
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’;
std::reverse(a.begin(), a.end());
for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';
sort/stable_sort
•sort(begin, end) : [begin, end)를 <를 기준으로 정
렬한다.
•sort(begin, end, cmp) : [begin, end)를 cmp를 기준
으로 정렬한다.
sort/stable_sort
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’;
std::sort(a.begin(), a.end());
for(int i=0;i<a.size();i++) std::cout<<a[i]<<‘ ';
sort/stable_sort
bool 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]<<‘ ';
binary_search
•binary_search(begin, end, value) : [begin, end)에
서 value를 찾으면 true, 못 찾으면 false
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)
lower_bound/upper_bound
std::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';
}
lower_bound/upper_bound
1: lower_bound: 0 upper_bound: 1
2: lower_bound: 1 upper_bound: 3
3: lower_bound: 3 upper_bound: 4
4: lower_bound: 4 upper_bound: 7
5: lower_bound: 7 upper_bound: 7
min_element/max_element
•min_element(begin, end)
•min_element(begin, end, cmp)
•max_element(begin, end)
•max_element(begin, end, cmp)
min_element/max_element
std::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';

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