tree;
+ while (cin >> num) {
+ tree.push_back(num);
+ }
+
+ //연산 + 출력
+ postOrder(0, tree.size() - 1, tree);
+}
\ No newline at end of file
diff --git "a/12_\355\212\270\353\246\254/\355\225\204\354\210\230/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251" "b/12_\355\212\270\353\246\254/\355\225\204\354\210\230/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251"
deleted file mode 100644
index e69de29b..00000000
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/README.md" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/README.md"
index e69de29b..e7333b20 100644
--- "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/README.md"
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/README.md"
@@ -0,0 +1,76 @@
+# 최단 경로 (Shortest Path)
+
+[메인으로 돌아가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4)
+
+## 💻 튜터링
+
+### 라이브 코딩
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :-----------------------------------------------------------------------: | :----------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :----------: | :--------: |
+| 1753 | 최단경로 |
| [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/13_%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C/%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%BD%94%EB%94%A9/1753.cpp) | 다익스트라 |
+| 11404 | 플로이드 |
| [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/13_%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C/%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%BD%94%EB%94%A9/11404.cpp) | 플로이드-워셜 |
+| 11657 | 타임머신 |
| [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/13_%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C/%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%BD%94%EB%94%A9/11657.cpp) | 벨만-포드 |
+
+## ✏️ 과제
+
+### 마감기한
+
+~ 5 / 30 (화) 18:59 - 과제 제출
+~ 6 / 1 (목) 23:59 - 추가 제출
+
+### 필수
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :-----------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :------------------------: |
+| 15685 | 드래곤 커브 |
| [C++]() | 구현, 시뮬레이션 |
+| 1238 | 파티 |
| [C++]() | 다익스트라 |
+| 2458 | 키 순서 |
| [C++]() | 플로이드-워셜 |
+
+### 도전
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :--------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :--: |
+| 프로그래머스 | 합승 택시 요금 | **Lv.3** | [C++]() | 플로이드-워셜 |
+| 1865 | 웜홀 |
| [C++]() | 벨만-포드 |
+---
+
+### 힌트
+
+
+드래곤 커브
+
+ 뱀의 머리와 꼬리에 변화가 생기고 있네요! 어떤 자료구조가 필요할까요? 뱀의 현재 위치를 직접 나타내보는 것도 좋을 것 같네요.
+
+
+
+
+파티
+
+ 이제 어떤 지점을 가기만 하는 게 아니라 오기도 해야 하니 다익스트라 알고리즘을 여러 번 사용해야겠습니다!
+
+
+
+
+키 순서
+
+ 두 사람 사이의 키 순위를 비교해볼까요? 나와 상대방과의 키 순위를 안다는 것은 내가 상대방과의 키 우열을 알거나 상대방이 나와의 키 우열을 안다는 것과 같습니다.
+
+
+
+
+합승 택시 요금
+
+ 함께 합승할 수 있는 지점은 총 몇 개인가요? 계산에 고려해야 할 가능한 시작, 도착 지점의 쌍이 어떻게 될까요?
+
+
+
+
+웜홀
+
+ 시간이 뒤로 갈 수 있다네요? 음수 가중치일때 사용할 수 있는 알고리즘을 배웠었죠! 것보다 벨만 포드는 분명 출발점이 특정한 한 점일때 가능한 알고리즘이라고 배웠는데,시작지점이 정해져있지 않네요. 그런데 특정 정점 하나만 확인하면 해당 정점과 단절된 노드가 포함된 음수 사이클을 발견할 수 없죠! 우리는 최단거리에는 관심이 없고, 오로지 음수 사이클의 존재 여부만 확인하고 싶은 상황에서 어떻게 하면 될까요?
+
+
+
+
+---
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/13_\354\265\234\353\213\250\352\262\275\353\241\234_\353\254\270\354\240\234\355\225\264\354\204\244.pdf" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/13_\354\265\234\353\213\250\352\262\275\353\241\234_\353\254\270\354\240\234\355\225\264\354\204\244.pdf"
new file mode 100644
index 00000000..748ad33b
Binary files /dev/null and "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/13_\354\265\234\353\213\250\352\262\275\353\241\234_\353\254\270\354\240\234\355\225\264\354\204\244.pdf" differ
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/13_\354\265\234\353\213\250\352\262\275\353\241\234_\354\235\264\353\241\240.pdf" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/13_\354\265\234\353\213\250\352\262\275\353\241\234_\354\235\264\353\241\240.pdf"
new file mode 100644
index 00000000..9178dc29
Binary files /dev/null and "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/13_\354\265\234\353\213\250\352\262\275\353\241\234_\354\235\264\353\241\240.pdf" differ
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\352\260\225\354\235\230 \354\236\220\353\243\214/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251"
deleted file mode 100644
index e69de29b..00000000
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11404.cpp" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11404.cpp"
new file mode 100644
index 00000000..b8d0b059
--- /dev/null
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11404.cpp"
@@ -0,0 +1,46 @@
+#include
+#include
+#include
+
+using namespace std;
+const int INF = 1e7; // 최대 n-1개의 간선을 지나므로 n * (가중치 최대값)
+
+void floydWarshall(int n, vector> &graph) {
+ for (int k = 1; k <= n; k++) { // 중간 정점
+ for (int i = 1; i <= n; i++) { // 출발 정점
+ for (int j = 1; j <= n; j++) { // 도착 정점
+ // 중간에 k를 거쳐서 i에서 j로 갈 때의 비용
+ int cost = graph[i][k] + graph[k][j];
+ // 더 짧은 경로 선택
+ graph[i][j] = min(graph[i][j], cost);
+ }
+ }
+ }
+}
+
+int main() {
+ int n, m, a, b, c;
+
+ // 입력
+ cin >> n >> m;
+ vector> graph(n + 1, vector(n + 1, INF));
+ for (int i = 1; i <= n; i++) { // 자기 자신과의 거리
+ graph[i][i] = 0;
+ }
+ while (m--) {
+ cin >> a >> b >> c;
+ graph[a][b] = min(graph[a][b], c); // 비용 여러개일 수 있으므로 최솟값으로
+ }
+
+ // 연산
+ floydWarshall(n, graph);
+
+ // 출력
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ cout << (graph[i][j] == INF ? 0 : graph[i][j]) << ' ';
+ }
+ cout << '\n';
+ }
+ return 0;
+}
\ No newline at end of file
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11657.cpp" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11657.cpp"
new file mode 100644
index 00000000..f9f5a8aa
--- /dev/null
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11657.cpp"
@@ -0,0 +1,63 @@
+#include
+#include
+#include
+
+using namespace std;
+typedef pair ci;
+const int INF = 2e5; // 최대 V-1개의 간선을 지나게 됨 -> V * (가중치 최대값)
+
+// 다익스트라
+vector dijkstra(int start, int v, vector> &graph) {
+ vector dist(v + 1, INF); // 각 정점까지의 최단 경로 저장
+ // 현재 탐색하는 중간 정점까지의 최단 경로
+ priority_queue, greater<>> pq; // first: 시작점으로부터의 거리, second: 정점
+
+ // 시작 정점 초기화
+ dist[start] = 0;
+ pq.push({0, start});
+ while (!pq.empty()) {
+ int weight = pq.top().first; // 현재 정점까지의 경로값
+ int node = pq.top().second; // 현재 탐색하려는 정점
+ pq.pop();
+
+ if (weight > dist[node]) { // 이미 더 작은 값으로 기록된 정점
+ continue;
+ }
+ for (int i = 0; i < graph[node].size(); i++) {
+ int next_node = graph[node][i].first; // 연결된 정점
+ // 시작점으로부터 현재 node를 거쳐 다음 정점까지 가는 경로값
+ int next_weight = weight + graph[node][i].second;
+ if (next_weight < dist[next_node]) { // 최단 경로 값이 갱신된다면
+ dist[next_node] = next_weight;
+ pq.push({next_weight, next_node});
+ }
+ }
+ }
+ return dist;
+}
+
+int main() {
+ int v, e, k, a, b, w;
+
+ // 입력
+ cin >> v >> e >> k;
+ vector> graph(v + 1, vector(0)); // 인접 리스트
+ while (e--) {
+ cin >> a >> b >> w;
+ graph[a].push_back({b, w}); // 방향 그래프
+ }
+
+ // 연산
+ vector dist = dijkstra(k, v, graph);
+
+ // 출력
+ for (int i = 1; i <= v; i++) {
+ if (dist[i] == INF) {
+ cout << "INF";
+ } else {
+ cout << dist[i];
+ }
+ cout << '\n';
+ }
+ return 0;
+}
\ No newline at end of file
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/1753.cpp" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/1753.cpp"
new file mode 100644
index 00000000..29aa6a14
--- /dev/null
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/1753.cpp"
@@ -0,0 +1,63 @@
+#include
+#include
+#include
+
+using namespace std;
+typedef pair ci;
+const int INF = 2e5; // 최대 V-1개의 간선을 지나게 됨 -> V * (가중치 최대값)
+
+// 다익스트라
+vector dijkstra(int start, int v, vector> &graph) {
+ vector dist(v + 1, INF); //각 정점까지의 최단 경로 저장
+ // 현재 탐색하는 중간 정점까지의 최단 경로
+ priority_queue, greater<>> pq; // first: 시작점으로부터의 거리, second: 정점
+
+ // 시작 정점 초기화
+ dist[start] = 0;
+ pq.push({0, start});
+ while (!pq.empty()) {
+ int weight = pq.top().first; // 현재 정점까지의 경로값
+ int node = pq.top().second; // 현재 탐색하려는 정점
+ pq.pop();
+
+ if (weight > dist[node]) { // 이미 더 작은 값으로 기록된 정점
+ continue;
+ }
+ for (int i = 0; i < graph[node].size(); i++) {
+ int next_node = graph[node][i].first; // 연결된 정점
+ // 시작점으로부터 현재 node를 거쳐 다음 정점까지 가는 경로값
+ int next_weight = weight + graph[node][i].second;
+ if (next_weight < dist[next_node]) { // 최단 경로 값이 갱신된다면
+ dist[next_node] = next_weight;
+ pq.push({next_weight, next_node});
+ }
+ }
+ }
+ return dist;
+}
+
+int main() {
+ int v, e, k, a, b, w;
+
+ // 입력
+ cin >> v >> e >> k;
+ vector> graph(v + 1, vector(0)); // 인접 리스트
+ while (e--) {
+ cin >> a >> b >> w;
+ graph[a].push_back({b, w}); // 방향 그래프
+ }
+
+ // 연산
+ vector dist = dijkstra(k, v, graph);
+
+ // 출력
+ for (int i = 1; i <= v; i++) {
+ if (dist[i] == INF) {
+ cout << "INF";
+ } else {
+ cout << dist[i];
+ }
+ cout << '\n';
+ }
+ return 0;
+}
\ No newline at end of file
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251"
deleted file mode 100644
index e69de29b..00000000
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/1238.cpp" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/1238.cpp"
new file mode 100644
index 00000000..92e36283
--- /dev/null
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/1238.cpp"
@@ -0,0 +1,89 @@
+#include
+#include
+#include
+#include
+
+//단반향 도로이므로 가는길과 돌아오는 길을 구분함을 주의
+//따라서 걸리는 시간을 배열로 만들어 가장 큰 값을 출력
+
+int inf= 987654321;
+using namespace std;
+
+int n, m, x;
+int dist[1010], res[1010];
+vector> v[1010];//간선의 정보 저장
+
+void Input(){
+ cin >> n >> m >> x; //초기 입력값
+
+ for (int i = 0; i < m; i++){
+ int a, b, c;
+ cin >> a >> b >> c;
+ v[a].push_back(make_pair(b, c));//간선의 정보를 push
+ }
+}
+
+void Dijkstra(int start){
+
+ priority_queue> PQ;
+ dist[start] = 0;
+ PQ.push(make_pair(0, start));
+
+ while (PQ.empty() == 0){
+
+ int cost = -PQ.top().first;
+ int cur = PQ.top().second;
+ PQ.pop(); //coast와 cur에 저장한 다음 pop
+
+ if (cost > dist[cur]) {//탐색하려는 값이 기존 값 보다 크다면 탐색할 필요x->구하지 않고 넘어감
+ continue;
+ }
+
+ for (int i = 0; i < v[cur].size(); i++){
+ int next = v[cur][i].first;
+ int nCost = v[cur][i].second;
+
+ if (dist[next] > cost + nCost){//만약 더 크다면->최소값으로 갱신->pq에 저장
+ dist[next] = cost + nCost;
+ PQ.push(make_pair(-dist[next], next));
+ }
+ }
+ }
+
+}
+
+void Solution() {
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ dist[j] = inf;
+ }
+ Dijkstra(i);
+ res[i] = dist[x];//i에서 x까지 가는데 걸리는 시간을 구함->res[i]에 저장
+ }
+ for (int j = 1; j <= n; j++) {
+ dist[j] = inf;//배열 다시 초기화
+ }
+
+ Dijkstra(x);// x에서 i까지 가는데 걸리는 시간
+ for (int i = 1; i <= n; i++) {
+ res[i] = res[i] + dist[i];//총 소요 시간=가는데 걸리는 시간+오는데 걸리는 시간 (도로가 단방향이므로)
+ }
+
+ sort(res + 1, res + n + 1);// 가장 큰 값을 찾기 위해 정렬
+ int answer = res[n];//가장 큰 값
+
+ cout << answer;
+}
+
+int main(){
+ ios::sync_with_stdio(false);
+ cin.tie(NULL);
+ cout.tie(NULL);
+
+ Input();
+ Solution();
+
+ return 0;
+}
+
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/15685-\354\266\224\352\260\200\354\240\234\354\266\234.cpp" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/15685-\354\266\224\352\260\200\354\240\234\354\266\234.cpp"
new file mode 100644
index 00000000..6748759c
--- /dev/null
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/15685-\354\266\224\352\260\200\354\240\234\354\266\234.cpp"
@@ -0,0 +1,72 @@
+#include
+#include
+
+using namespace std;
+
+const int SIZE = 100;//좌표계의 최대값
+
+// 방향: 우(0), 상(1), 좌(2), 하(3)
+int dy[4] = { 0, -1, 0, 1 };
+int dx[4] = { 1, 0, -1, 0 };
+
+// 1x1 정사각형 개수 계산
+int cntSquares(vector>& plane) {
+ int ans = 0;
+ for (int i = 0; i < SIZE; i++) {
+ for (int j = 0; j < SIZE; j++) {
+ if (plane[i][j] && plane[i + 1][j] && plane[i][j + 1] && plane[i + 1][j + 1]) {
+ ans++;// 좌표밖을 벗어나지 않는다면->ans 증가
+ }
+ }
+ }
+ return ans;
+}
+
+// 평면에 드래곤 커브를 표시
+void drawDragonCurve(vector>& plane, int x, int y, int d, int g) {
+ vector direct; // 방향 저장
+ plane[y][x] = plane[y + dy[d]][x + dx[d]] = true; // 평면에 표시 (초기화)
+ x += dx[d];
+ y += dy[d];
+ direct.push_back(d);
+ while (g--) { // 1 ~ g 세대
+ int size_d = direct.size();
+ for (int j = size_d - 1; j >= 0; j--) { // 방향 계산
+ int next_d = (direct[j] + 1) % 4;//90도로 4, 8, 12... 회전하면 원위치이므로 %4를 해줌
+ x += dx[next_d];
+ y += dy[next_d];
+ plane[y][x] = true; // 평면에 표시
+ direct.push_back(next_d);
+ }
+ }
+}
+
+/*
+* 규칙
+* 0 세대: 0
+* 1 세대: 0 1
+* 2 세대: 0 1 2 1
+* 3 세대: 0 1 2 1 2 3 2 1
+* ...
+* N 세대: concat((N-1세대), ((N-1세대 거꾸로) + 1)%4)
+* 평면(좌측 상단이 (0, 0))에 드래곤 커브를 그린 후 정사각형의 개수를 계산
+* 드래곤 커브는 평면 밖으로 나가지 않음으로 범위를 확인할 필요 없음
+* 1. 0 세대의 드래곤 커브를 먼저 저장 (초기 조건)
+* 2. 세대를 거듭하면서 드래곤 커브를 그림 (규칙을 파악하는 것이 중요)
+* 3. 드래곤 커브가 그려진 평면 상의 정사각형의 개수 계산 (네 꼭짓점 확인)
+*/
+
+int main()
+{
+ int n, x, y, d, g;
+ vector> plane(SIZE + 1, vector(SIZE + 1, false)); // 평면
+ // 입력
+ cin >> n;
+ // 연산 & 출력
+ while (n--) { // n개의 드래곤 커브 그리기
+ cin >> x >> y >> d >> g;
+ drawDragonCurve(plane, x, y, d, g); //드래곤 커브 계산
+ }
+ cout << cntSquares(plane) << '\n';//드래곤 커브 중 답이 될 수 있는 것(=좌표를 벗어나지 않는 것)을 계산->출력
+ return 0;
+}
\ No newline at end of file
diff --git "a/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/2458-\354\266\224\352\260\200\354\240\234\354\266\234.cpp" "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/2458-\354\266\224\352\260\200\354\240\234\354\266\234.cpp"
new file mode 100644
index 00000000..c1075d86
--- /dev/null
+++ "b/13_\354\265\234\353\213\250 \352\262\275\353\241\234/\355\225\204\354\210\230/2458-\354\266\224\352\260\200\354\240\234\354\266\234.cpp"
@@ -0,0 +1,66 @@
+#include
+#include
+#include
+
+using namespace std;
+const int INF = 501; // 최대 n-1개의 간선을 지나므로 n * (가중치 최대값)
+
+void init(int n, vector>& graph) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ graph[i][j] = INF;//최대값으로 초기화
+ }
+ }
+ for (int i = 1; i <= n; i++) {
+ graph[i][i] = 0; //자기자신 가중치=0임으로 0으로 초기화
+ }
+}
+
+void floydWarshall(int n, vector>& graph) {
+ for (int k = 1; k <= n; k++) { // 중간 정점
+ for (int i = 1; i <= n; i++) { // 출발 정점
+ for (int j = 1; j <= n; j++) { // 도착 정점
+ // 중간에 k를 거쳐서 i에서 j로 갈 때의 비용
+ int cost = graph[i][k] + graph[k][j];
+ // 더 짧은 경로 선택
+ graph[i][j] = min(graph[i][j], cost);
+ }
+ }
+ }
+}
+
+int countStudents(int student, int n, vector>& graph) {
+ int i = 1, cnt = 0;
+ for (i = 1; i <= n; i++) {
+ if (student != i && graph[student][i] == INF && graph[i][student] == INF) {
+ return 0;
+ }
+ }
+ return 1;
+}
+/*
+ * 키순서
+ * 내 키의 순위를 안다 <-> 내가 상대방과의 키 우열을 안다 or 상대방이 나와의 키 우열을 안다
+*/
+int main()
+{
+ int n, m;
+ int answer = 0;
+ vector> graph(INF, vector(INF));
+ // 입력
+ cin >> n >> m;
+ init(n, graph); // 초기화
+ while (m--) {
+ int a, b;
+ cin >> a >> b;
+ graph[a][b] = 1; // 키 우열을 아는 두 정점의 거리를 1이라고 하자
+ }
+ // 연산
+ floydWarshall(n, graph);
+ for (int i = 1; i <= n; i++) { // 자신의 키가 몇 번째인지 알 수 있는 학생들이 몇 명인지 계산
+ answer += countStudents(i, n, graph);//자기보다 작은 학생들이 있으면 1반환->학생수만큼 반복하면 카운트
+ }
+ // 출력
+ cout << answer << '\n';
+ return 0;
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index dbf4b4d4..15359915 100644
--- a/README.md
+++ b/README.md
@@ -29,8 +29,8 @@ SW학부 원스탑 튜터링에서 진행하는 코딩 테스트 대비 알고
| 2023.04.14 | 동적 계획법 | [@sujeong000](https://github.com/sujeong000) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/09_%EB%8F%99%EC%A0%81%20%EA%B3%84%ED%9A%8D%EB%B2%95/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C/09_%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95_%EC%9D%B4%EB%A1%A0.pdf) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/09_%EB%8F%99%EC%A0%81%20%EA%B3%84%ED%9A%8D%EB%B2%95) | - |
| 2023.05.05 | 이분 탐색 | [@grdnr13](https://github.com/grdnr13) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C/10_%EC%9D%B4%EB%B6%84%ED%83%90%EC%83%89_%EC%9D%B4%EB%A1%A0.pdf) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89) | 녹화 강의 제공 |
| 2023.05.12 | 투 포인터 | [@kwakrhkr59](https://github.com/kwakrhkr59) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0) | - |
-| 2023.05.19 | 트리 | [@dbswn](https://github.com/dbswn) | [바로가기]() | [바로가기]() | - |
-| 2023.05.26 | 최단 경로 | [@Dong-droid](https://github.com/Dong-droid) | [바로가기]() | [바로가기]() | - |
+| 2023.05.19 | 트리 | [@dbswn](https://github.com/dbswn) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/12_%ED%8A%B8%EB%A6%AC/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C/12_%ED%8A%B8%EB%A6%AC_%EC%9D%B4%EB%A1%A0.pdf) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/12_%ED%8A%B8%EB%A6%AC) | - |
+| 2023.05.26 | 최단 경로 | [@Dong-droid](https://github.com/Dong-droid) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/13_%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C/13_%EC%B5%9C%EB%8B%A8%EA%B2%BD%EB%A1%9C_%EC%9D%B4%EB%A1%A0.pdf) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/13_%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C) | - |
| 2023.06.02 | 유니온 파인드 | [@bsa0322](https://github.com/bsa0322) | [바로가기]() | [바로가기]() | 2기 자료 제공 |
| 2023.06.02 | 최소 신장 트리 | [@ZERO-black](https://github.com/ZERO-black) | [바로가기]() | [바로가기]() | 2기 자료 제공 |
| 2023.06.02 | 위상 정렬 | [@bsa0322](https://github.com/bsa0322) | [바로가기]() | [바로가기]() | 2기 자료 제공 |