[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[C++ Korea] Effective Modern C++ Study item 24-26Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26
Item 24: Distinguish universal references from rvalue references. +석정로
Item 25 : Use std::move on rvalue references,
std::forward on universal references. +서승덕
Item 26 : Avoid overloading on universal references. +윤석준
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[C++ Korea] Effective Modern C++ Study item 24-26Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26
Item 24: Distinguish universal references from rvalue references. +석정로
Item 25 : Use std::move on rvalue references,
std::forward on universal references. +서승덕
Item 26 : Avoid overloading on universal references. +윤석준
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Item 20, 21, 23
Item 20 : Use std::weak_ptr for std::shared_ptr-like pointers that can dangle. +정은식
Item 21 : Prefer std::make_unique and std::make_shared to direct use of new. +이동우
Item 23 : Understand std::move and std::forward. +제한재
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
이 발표는 이전에 발표했던 내용에서 일부 사례 추가 및 최신 내용으로 갱신한 버전입니다.
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Item 20, 21, 23
Item 20 : Use std::weak_ptr for std::shared_ptr-like pointers that can dangle. +정은식
Item 21 : Prefer std::make_unique and std::make_shared to direct use of new. +이동우
Item 23 : Understand std::move and std::forward. +제한재
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
이 발표는 이전에 발표했던 내용에서 일부 사례 추가 및 최신 내용으로 갱신한 버전입니다.
홍익대학교 알고리즘학회 HI-ARC 에서 ACM-ICPC 준비하는 사람들의 약점을 서로서로 채워주는 모임을 진행해왔는데, 그 중에 문자열 알고리즘 중 하나인 KMP 알고리즘을 주제로 발표했었읍니다.
2018년 6월 28일 기준 BOJ 50위권 진입하신 ssangba55 님 리스펙......
2. DFS (Depth First Search)
우리말로는 깊이 우선 탐색
Void DFS(int i) {
visited[i] = true;
for(auto v : graph[i])
if(!visited[v])
DFS(v); // 방문하지 않았을 경우 재귀적으로 시행
}
쉽게 말해서 먼저 보이는 지점부터 방문한다!
한번 방문한 지점은 두번 다시 확인할 필요 없도록 true 로 마킹해둔다.
3. DFS 가 동작하는 과정
A
B C D
E F G H
J
I
1
2
3
4
5
6
7
8
9
10
방문순서 :
A - B - E - F - C - G - J - H - D - I
4. DFS 를 이용한 여러가지 알고리즘
● Flood fill
● Euler circuit
● Articulation point & Bridge
● Connected Components
● Strong Connected Components
● Topological Sort
● 2-SAT problem
● …...
5. #1 Connected Components
그래프 이론 용어 정리
● Connected component : 어떤 길이의 path 로든 서로 도달할 수 있는 정점들로
구성된 subgraph
○ C(v) = {u ∈ V | there exists a path in G from u to v }.
관계(Relation)의 관점으로 보면 reflecxive, symmetric, transitive 모두 성립.
Equivalence class 를 나타낼 때도 쓰일 수 있음.
9. #1 Connected Components
● Connected Component 는 어떻게 구할 것인가?
Undirected Graph 에서 도달할 수 있는 놈들끼리 분류한다.
● 그렇다면 어떻게 구현할 것인가?
방문한 적이 없는 각 정점마다 (더 이상 도달할 정점이 없을때까지) DFS를 수행한다.
10. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A)
* Connected component는 괄호로 묶어서 표시
11. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B)
* Connected component는 괄호로 묶어서 표시
12. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C)
* Connected component는 괄호로 묶어서 표시
13. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D)
* Connected component는 괄호로 묶어서 표시
14. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D)
* Connected component는 괄호로 묶어서 표시
15. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D E)
* Connected component는 괄호로 묶어서 표시
16. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D E)
* Connected component는 괄호로 묶어서 표시
17. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D E)
* Connected component는 괄호로 묶어서 표시
18. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D E)
* Connected component는 괄호로 묶어서 표시
19. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D E)
* Connected component는 괄호로 묶어서 표시
21. #1 Connected Components
Void dfs(int u) {
visited[u] = true;
for(auto v : graph[u])
if(!visited[v])
dfs(u);
}
Int main() {
for(int i=1; i<=V; ++i)
if(!visited(i)) {
dfs(i); dfs_count++;
}
}
A
B
C
E
F
G
I
D
H
J
DFS 방문 순서 : (A B C D E) (F G) (H I J)
* Connected component는 괄호로 묶어서 표시
22. #1 Connected Components
DFS 가 아니더라도, Disjoint Set 자료구조를 이용하여 구현할 수도 있다!
Disjoint Set 자료구조를 이용하는 방법은 Minimum Spanning Tree 세션에서 추후 설명
29. #3 Topological Sort
Void TopologicalSort(int u) {
Visited[u] = true;
for(auto v : graph[u])
if(!visited[v]) TopologicalSort(v); // 여기까지만 보면 DFS 와 유사함
stack_tmp.push(u); // 순회를 끝낸 노드는 push 해준다.
}
dependency가 없는 정점을 우선순위를 두더라도
구체적으로 어느 기준으로 정렬할 지 기준이 없으면 정답은 없음
30. Topological sort 관련 문제들
● 단순히 순서만 출력하는 문제
https://www.acmicpc.net/problem/1766
● 비용이 추가로 들어간 문제
https://www.acmicpc.net/problem/1005
https://www.acmicpc.net/problem/1516
https://www.acmicpc.net/problem/2056
31. #4 Strongly Connected Components
● C(v) = { u ∈ V | there exists a path in G from u to v and a path
in G from v to u }.
Directed Graph 에서 도달할 수 있는 놈들끼리 분류한다.
34. SCC 알고리즘을 구현하는 두가지 알고리즘
● Kosaraju algorithm
○ DFS 를 두번 돌리는 알고리즘
○ 정방향 그래프와 역방향 그래프가 같은 SCC를 가진다는 성질을 이용함
○ O(V + E)
● Tarjan algorithm
○ O(V + E)
둘 중 어떤 알고리즘을 써도 상관 없다.
35. #4 Strongly Connected Components
Void KosarajuSCC(int u) {
1. 정방향 그래프를 위상정렬 후 스택에 저장
(순회를 끝낸 노드를 스택에 push 하는 방식으로 DFS)
2. 스택이 빌 때까지 최상위 원소부터 하나씩 빼가면서
(방문하지 않았을 경우에만) 역방향 그래프에서 DFS를 수행
2-1. 위에서 수행하는 DFS에서 탐색되는 모든 노드를 SCC로 묶는다.
}