cookie(n);
+ // 막대과자 길이 입력
+ for (int i = 0; i < n; i++) {
+ cin >> cookie[i];
}
-
- //이분 탐색을 하기 위해 정렬
- sort(arr.begin(), arr.end());
-
- //출력
- cout << binarySearch(n, m, arr) << endl;
-
-
+ // 연산 & 출력
+ cout << binarySearch(m, cookie);
return 0;
-
-
-}
+}
\ No newline at end of file
diff --git "a/10_\354\235\264\353\266\204 \355\203\220\354\203\211/\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/10_\354\235\264\353\266\204 \355\203\220\354\203\211/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/README.md" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/README.md"
index e69de29b..ccb01fe4 100644
--- "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/README.md"
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/README.md"
@@ -0,0 +1,76 @@
+# 투 포인터 (Two Pointer)
+
+[메인으로 돌아가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4)
+
+## 💻 튜터링
+
+### 라이브 코딩
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :-----------------------------------------------------------------------: | :----------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :----------: | :--------: |
+| 11659 | 구간 합 구하기4 |
| [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%BD%94%EB%94%A9/11659.cpp) | 누적 합 |
+| 21921 | 블로그 |
| [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%BD%94%EB%94%A9/21921.cpp) | 누적 합, 슬라이딩 윈도우 |
+| 2470 | 두 용액 |
| [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%BD%94%EB%94%A9/2470.cpp) | 투 포인터 |
+
+## ✏️ 과제
+
+### 마감기한
+
+~ 5 / 16 (화) 18:59 - 과제 제출
+~ 5 / 18 (목) 23:59 - 추가 제출
+
+### 필수
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :-----------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :------------------------: |
+| 14503 | 로봇 청소기 |
| [C++_v1](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%ED%95%84%EC%88%98/14503_v1.cpp) [C++_v2](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%ED%95%84%EC%88%98/14503_v2.cpp) | 구현, 시뮬레이션 |
+| 20922 | 겹치는 건 싫어 |
| [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%ED%95%84%EC%88%98/20922.cpp) | 투 포인터 |
+| 20437 | 문자열 게임 2 |
| [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%ED%95%84%EC%88%98/20437.cpp) | 슬라이딩 윈도우 |
+
+### 도전
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :--------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :--: |
+| 13422 | 도둑 |
| [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%EB%8F%84%EC%A0%84/13422.cpp) | 투 포인터, 슬라이딩 윈도우 |
+| 2473 | 세 용액 |
| [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/11_%ED%88%AC%20%ED%8F%AC%EC%9D%B8%ED%84%B0/%EB%8F%84%EC%A0%84/2473.cpp) | 투 포인터 |
+---
+
+### 힌트
+
+
+로봇 청소기
+
+ 청소할 공간이 없을 때까지 계속해서 청소하는 방식이네요. 배웠던 알고리즘과 비슷해보이지 않나요? 방향에 유의하여 풀어보아요.
+
+
+
+
+겹치는 건 싫어
+
+ 두 포인터를 맨 왼쪽에 두고 오른쪽에 있는 숫자를 현재 수열에 추가할 수 있을지 없을지를 생각하며 탐색해볼까요?
+
+
+
+
+문자열 게임 2
+
+ 특정 문자가 k개 포함되면서 양쪽 끝이 해당 문자로 같아야 한다고 하니 우리에게 필요한 건 각 문자의 위치겠네요! 슬라이딩 윈도우를 사용해서 풀이해줘야 할 것 같은데, 윈도우의 크기는 얼마여야 할까요?
+
+
+
+
+도둑
+
+ 마을이 원이라는 점에 주의하여 슬라이딩 윈도우로 훔칠 수 있는 돈을 계산해봅시다.
+
+
+
+
+세 용액
+
+ 라이브코딩에서 다뤘던 두 용액 문제에 용액 하나가 추가됐네요! 포인터 3개를 쓰기는 힘들 것 같으니 결국 투포인터를 사용해 풀이해줘야 하는데, 나머지 하나는 어떻게 하면 좋을까요? 한 용액이 반드시 포함되도록 하고 나머지 두 용액을 찾아주면 좋을 것 같네요.
+
+
+
+
+---
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\352\260\225\354\235\230 \354\236\220\353\243\214/11_\355\210\254\355\217\254\354\235\270\355\204\260_\353\254\270\354\240\234\355\225\264\354\204\244.pdf" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\352\260\225\354\235\230 \354\236\220\353\243\214/11_\355\210\254\355\217\254\354\235\270\355\204\260_\353\254\270\354\240\234\355\225\264\354\204\244.pdf"
new file mode 100644
index 00000000..793aa5cb
Binary files /dev/null and "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\352\260\225\354\235\230 \354\236\220\353\243\214/11_\355\210\254\355\217\254\354\235\270\355\204\260_\353\254\270\354\240\234\355\225\264\354\204\244.pdf" differ
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\352\260\225\354\235\230 \354\236\220\353\243\214/11_\355\210\254\355\217\254\354\235\270\355\204\260_\354\235\264\353\241\240.pdf" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\352\260\225\354\235\230 \354\236\220\353\243\214/11_\355\210\254\355\217\254\354\235\270\355\204\260_\354\235\264\353\241\240.pdf"
new file mode 100644
index 00000000..dfd988c8
Binary files /dev/null and "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\352\260\225\354\235\230 \354\236\220\353\243\214/11_\355\210\254\355\217\254\354\235\270\355\204\260_\354\235\264\353\241\240.pdf" differ
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/13422.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/13422.cpp"
new file mode 100644
index 00000000..204ba829
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/13422.cpp"
@@ -0,0 +1,51 @@
+#include
+#include
+using namespace std;
+
+/**m개의 집에서 k보다 작은 돈을 훔칠 수 있는 경우의 수 구하기*/
+int steal(vector house, int n, int m, int k) {
+ int ans = 0; // 훔칠 수 있는 가짓수
+ int total = 0; // 현재 도둑질한 돈
+ int left = 0, right = m - 1;
+
+ for(int i = left; i <= right; i++) {
+ total += house[i];
+ }
+ if(n == m) { // 모든 집을 훔쳐야하는 경우 -> 즉시 리턴
+ return total < k;
+ }
+
+ while(left != n) { // 슬라이딩 윈도우
+ if(total < k) { // 도둑질한 돈이 k보다 작으면 훔칠 수 있음
+ ans++;
+ }
+ total -= house[left++];
+ right = (right+1) % n;
+ total += house[right];
+ }
+ return ans;
+}
+/**[백준 13422: 도둑]
+ * 1. 윈도우의 크기를 m으로 설정하고, 윈도우를 시계방향으로 움직이면서 도둑질할 수 있는 돈 계산
+ * 2. right는 left보다 m만큼 떨어지는 집으로 설정하면, 마을이 원 모양으로 생겼으므로 right가 인덱스 범위를 벗어날 수 있음!
+ * -> right = (left + m)이 아닌 right = (left + m) % n
+ * 3. (주의) n == m인 경우, 모든 집을 훔쳐야 하므로 슬라이딩 윈도우로 탐색하지 않고 바로 현재 값 리턴
+*/
+int main() {
+ int t, n, m, k;
+ vector house;
+
+ // 입력
+ cin >> t;
+ while (t--) {
+ cin >> n >> m >> k;
+ house.assign(n, 0);
+ for (int i = 0; i < n; i++) {
+ cin >> house[i];
+ }
+
+ // 연산 & 출력
+ cout << steal(house, n, m, k) << "\n";
+ }
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp"
new file mode 100644
index 00000000..a3b6ccc9
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp"
@@ -0,0 +1,64 @@
+#include
+#include
+#include
+#include // abs()
+#include // sort()
+
+#define INF 3 * 1e9 + 1
+typedef long long ll;
+using namespace std;
+
+/**투 포인로 세 용액의 합이 가장 0에 가까운 용액 튜플 리턴*/
+tuple calSum(vector liquid) {
+ ll min_value = INF;
+ tuple ans;
+
+ // 세 용액 중 하나(i)를 고정하고 나머지 두 용액에 해당될 용액 쌍을 투포인터로 탐색
+ for (int i = 0; i < liquid.size() - 2; i++) {
+ // 포인터 초기화
+ int left = i + 1; // 두 번째 용액
+ int right = liquid.size() - 1; // 세 번째 용액
+ // left는 항상 right보다 작아야 함
+ while (left < right) {
+ ll value = liquid[i] + liquid[left] + liquid[right]; // 현재 세 용액의 합
+ if (abs(value) < min_value) {
+ min_value = abs(value);
+ ans = {liquid[i], liquid[left], liquid[right]};
+ }
+ if (value < 0) { // 현재 값이 0보다 작으면 더 큰 값을 만들어야 함 -> left++
+ left++;
+ } else if (value > 0) { // 현재 값이 0보다 크다면 더 작은 값을 만들어야 함 -> right--
+ right--;
+ } else { // 현재 값이 0이면 이보다 더 0보다 가까운 값은 존재하지 않으므로 탐색 종료
+ return ans;
+ }
+ }
+ }
+ return ans;
+}
+/**[백준 2473: 세 용액]
+ * 1. 합이 가장 0에 가까운 세 용액의 인덱스를 각각 i, left, right로 설정
+ * 2. i는 고정하고, left와 right로 투포인터를 이용해 탐색
+ * 3. 현재 세 용액의 합이 0보다 작으면 left++
+ * 4. 현재 세 용액의 합이 0보다 크면 right++
+ * 5. 현재 세 용액의 합이 0이면 이보다 더 0에 가까운 값은 존재하지 않으므로 탐색 종료
+*/
+int main() {
+ int n;
+ vector liquid;
+
+ // 입력
+ cin >> n;
+ liquid.assign(n, 0);
+ for (int i = 0; i < n; i++) {
+ cin >> liquid[i];
+ }
+
+ // 연산
+ sort(liquid.begin(), liquid.end());
+ tuple ans = calSum(liquid);
+
+ // 출력
+ cout << get<0>(ans) << " " << get<1>(ans) << " " << get<2>(ans);
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/\355\214\214\354\235\274\354\227\205\353\241\234\353\223\234\354\232\251" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11659.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11659.cpp"
new file mode 100644
index 00000000..974b8edb
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/11659.cpp"
@@ -0,0 +1,43 @@
+#include
+#include
+
+using namespace std;
+
+/* 누적 합 계산하기 */
+void calSum(int n, vector &sum) {
+ for (int i = 1; i <= n; i++) {
+ sum[i] += sum[i - 1]; // 첫번째 수부터 i번째 수까지의 누적 합
+ }
+}
+
+/* i번째 수부터 j번째 수까지의 합 계산하기 */
+int getPrefixSum(int i, int j, vector &sum) {
+ return sum[j] - sum[i - 1];
+}
+
+int main() {
+ // 입출력 성능 향상
+ ios_base::sync_with_stdio(false);
+ cin.tie(NULL);
+ cout.tie(NULL);
+
+ int n, m, i, j;
+ vector sum;
+
+ // 입력
+ cin >> n >> m;
+ sum.assign(n + 1, 0); // sum[0]을 0으로 설정 -> i-1이 0인 경우 따로 분리하지 않아도 됨
+ for(int i = 1; i <= n; i++) {
+ cin >> sum[i];
+ }
+
+ // 연산
+ calSum(n, sum);
+
+ while (m--) {
+ cin >> i >> j;
+ // 출력
+ cout << getPrefixSum(i, j, sum) << "\n";
+ }
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/21921.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/21921.cpp"
new file mode 100644
index 00000000..dfe87330
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/21921.cpp"
@@ -0,0 +1,77 @@
+#include
+#include
+
+using namespace std;
+typedef pair ci;
+
+//슬라이딩 윈도우로 최대 방문자 수(ans)와 그 기간의 개수를 pair로 리턴
+ci slidingWindow(vector &count, int n, int x) {
+ // 윈도우 초기화
+ int left = 1, right = x;
+ int visitor = 0; // 방문자 수
+ int cnt = 1; // 최대 방문자 수 기간 개수
+
+ for (int i = left; i <= right; i++) {
+ visitor += count[i];
+ }
+ int max_visitor = visitor; // 최대 방문자 수
+
+ while (right < n) {
+ visitor -= count[left++]; // 이번 윈도우에서 제외
+ visitor += count[++right]; // 이번 윈도우에서 추가
+
+ if (visitor > max_visitor) { // 현재 방문자 수(section_visitor)가 최대 방문자 수(ans)보다 크다면
+ max_visitor = visitor; // 최대 방문자 수(ans) 갱신
+ cnt = 1; // 최대 방문자 수 기간 개수 초기화
+ }
+ else if (visitor == max_visitor) { // 현재 방문자 수(section_visitor)가 최대 방문자 수(ans)와 같다면
+ cnt++; // 최대 방문자 수 기간 개수 1 추가
+ }
+ }
+ return {max_visitor, cnt};
+}
+
+ci prefixSum(vector &count, int n, int x) {
+ int max_visitor = 0, cnt = 0;
+ vector sum(n + 1, 0); // i번째 일까지의 방문자 수 누적합 저장하는 배열
+ for(int i = 1; i <= n; i++) {
+ sum[i] = sum[i - 1] + count[i];
+ }
+
+ for(int i = x; i <= n; i++) {
+ int visitor = sum[i] - sum[i - x]; // i-x부터 x일간 방문자 수
+ if (visitor > max_visitor) { // 최대 방문자 수 갱신
+ max_visitor = visitor;
+ cnt = 1;
+ }
+ else if (visitor == max_visitor) { // 최대 방문자 수가 같은 경우 기간 개수 갱신
+ cnt++;
+ }
+ }
+ return {max_visitor, cnt};
+}
+
+int main() {
+ int x, n;
+ vector count;
+
+ // 입력
+ cin >> n >> x;
+ count.assign(n + 1, 0);
+ for (int i = 1; i <= n; i++) {
+ cin >> count[i];
+ }
+
+ // 연산
+ ci ans = slidingWindow(count, n, x);
+ // ci ans = prefixSum(count, n, x);
+
+ // 출력
+ if (ans.first == 0) { // 최대 방문자 수가 0이면
+ cout << "SAD";
+ } else {
+ cout << ans.first << "\n" << ans.second;
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/2470.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/2470.cpp"
new file mode 100644
index 00000000..a04b4027
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\353\235\274\354\235\264\353\270\214 \354\275\224\353\224\251/2470.cpp"
@@ -0,0 +1,50 @@
+#include
+#include
+#include //abs()
+#include //sort()
+
+using namespace std;
+typedef pair ci;
+
+/* 투 포인로 두 용액의 합이 가장 0에 가까운 용액 쌍 리턴 */
+ci mixLiquid(vector &liquid, int left, int right){
+ int min_value = abs(liquid[left] + liquid[right]); // 두 용액의 합의 값 중 가장 가까운 값
+ ci ans = {liquid[left], liquid[right]}; // 합이 가장 0에 가까운 두 용액의 특성값
+
+ // left는 항상 right보다 작아야 함
+ while (left < right) {
+ int value = liquid[left] + liquid[right]; // 두 용액 혼합
+ if(abs(value) < min_value) { // 현재 합이 min_value보다 더 0에 가까우면
+ min_value = abs(value); // min_value 갱신
+ ans = {liquid[left], liquid[right]}; // ans 갱신
+ }
+ if (value < 0) { // 현재 값이 0보다 작다면 더 큰 값을 만들어야 함 -> lef++
+ left++;
+ } else if (value > 0) { // 현재 값이 0보다 크다면 더 작은 값을 만들어야 함 -> right--
+ right--;
+ } else { // 현재 값이 0이면 이보다 더 0보다 가까운 값은 존재하지 않으므로 탐색 종료
+ break;
+ }
+ }
+ return ans;
+}
+
+int main() {
+ int n;
+ vector liquid;
+
+ // 입력
+ cin >> n;
+ liquid.assign(n, 0);
+ for (int i = 0; i < n; i++) {
+ cin >> liquid[i];
+ }
+
+ // 연산
+ sort(liquid.begin(), liquid.end());
+ ci ans = mixLiquid(liquid, 0, n - 1);
+
+ // 출력
+ cout << ans.first << " " << ans.second;
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503_v1.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503_v1.cpp"
new file mode 100644
index 00000000..83d3857b
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503_v1.cpp"
@@ -0,0 +1,74 @@
+#include
+
+using namespace std;
+
+const int SIZE = 50;
+const int CLEAN = 2;
+int n, m, cnt = 0; // 세로 크기, 가로 크기, 청소한 칸 개수
+
+int board[SIZE][SIZE]; // (0: 빈 칸, 1: 벽, 2: 청소 완료)
+int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0}; // 북 동 남 서
+
+void dfs(int row, int col, int dir) {
+ // 1. 현재 위치 청소
+ if(board[row][col] != CLEAN) {
+ cnt++;
+ }
+ board[row][col] = CLEAN;
+
+ // [현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는가]
+ // 3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우
+ for(int i = 0; i < 4; i++) { // 3-1. 반시계 방향으로 90º 회전
+ int new_dir = (dir-i+3) % 4;
+ int new_row = row + dy[new_dir], new_col = col + dx[new_dir];
+
+ if(board[new_row][new_col] == 0) { // 3-2. 아직 청소되지 않은 빈 칸 발견
+ dfs(new_row, new_col, new_dir); // 한 칸 전진
+ return;
+ }
+ }
+
+ // 2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우
+ int back_dir = (dir+2) % 4;
+ int back_row = row + dy[back_dir], back_col = col + dx[back_dir];
+
+ // [바라보는 방향을 유지한 채로 한 칸 후진할 수 있는가]
+ // 2-2. 뒤쪽 칸이 벽이라 후진할 수 없는 경우
+ if(board[back_row][back_col] == 1) {
+ return;
+ }
+ // 2-1. 바라보는 방향을 유지한 채로 한 칸 후진
+ dfs(back_row, back_col, dir); // 방향 유지한 상태로 후진 (2-3)
+ return;
+}
+
+/*
+ * [로봇 청소기 작동]
+ * 1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
+ * 2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
+ * 2-1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
+ * 2-2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
+ * 3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
+ * 3-1. 반시계 방향으로 90º 회전한다.
+ * 3-2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
+ * 3-3. 1번으로 돌아간다.
+*/
+
+int main() {
+ int r, c, d; // 로봇 청소기 정보
+
+ // 입력
+ cin >> n >> m;
+ cin >> r >> c >> d;
+
+ for(int i = 0; i < n; i++) {
+ for(int j = 0; j < m; j++) {
+ cin >> board[i][j];
+ }
+ }
+
+ // 연산 & 출력
+ dfs(r, c, d);
+ cout << cnt;
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503_v2.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503_v2.cpp"
new file mode 100644
index 00000000..5143611e
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503_v2.cpp"
@@ -0,0 +1,79 @@
+#include
+#include
+
+using namespace std;
+
+const int CLEAN = 2;
+
+int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0}; // 북 동 남 서
+
+int clean(int n, int m, int r, int c, int d, vector> &board) {
+ int cnt = 0;
+
+ while(true) {
+ // 1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
+ if(board[r][c] != CLEAN) {
+ cnt++;
+ }
+ board[r][c] = CLEAN;
+
+ bool find = false; // 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는가
+ for(int i = 0; i < 4; i++) {
+ int nd = (d-i+3) % 4;
+ int nr = r + dy[nd], nc = c + dx[nd];
+
+ if(board[nr][nc] == 0) { // 3-2. 아직 청소되지 않은 빈 칸 발견
+ find = true;
+ r = nr; c = nc; d = nd;
+ break;
+ }
+ }
+ if(find) { // 3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우 1번으로 돌아감
+ continue;
+ }
+
+ // 2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우
+ int bd = (d+2) % 4;
+ int br = r + dy[bd], bc = c + dx[bd];
+
+ // [바라보는 방향을 유지한 채로 한 칸 후진할 수 있는가]
+ // 2-2. 뒤쪽 칸이 벽이라 후진할 수 없는 경우
+ if(board[br][bc] == 1) {
+ return cnt;
+ }
+ // 2-1. 바라보는 방향을 유지한 채로 한 칸 후진
+ r = br; c = bc;
+ }
+ return cnt;
+}
+
+/*
+ * [로봇 청소기 작동]
+ * 1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
+ * 2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
+ * 2-1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
+ * 2-2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
+ * 3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
+ * 3-1. 반시계 방향으로 90º 회전한다.
+ * 3-2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
+ * 3-3. 1번으로 돌아간다.
+*/
+
+int main() {
+ int n, m, r, c, d;
+ vector> board;
+
+ // 입력
+ cin >> n >> m;
+ cin >> r >> c >> d;
+ board.assign(n, vector (m, 0));
+ for(int i = 0; i < n; i++) {
+ for(int j = 0; j < m; j++) {
+ cin >> board[i][j];
+ }
+ }
+
+ // 연산 & 출력
+ cout << clean(n, m, r, c, d, board);
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20437.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20437.cpp"
new file mode 100644
index 00000000..242d8381
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20437.cpp"
@@ -0,0 +1,61 @@
+#include
+#include
+#include
+
+using namespace std;
+typedef pair ci;
+const int MAX_ALPHA = 26; // 알파벳 개수
+
+/**문자를 k개 포함하는 가장 짧은 문자열과 가장 긴 문자열의 쌍 구하기*/
+ci solution(string w, int k) {
+ vector> char_idx(MAX_ALPHA);
+ int min_len = w.size(); // 가장 짧은 문자열 길이 초기화
+ int max_len = -1; // 가장 긴 문자열 길이 초기화
+
+ for (int i = 0; i < w.size(); i++) {
+ char_idx[w[i] - 'a'].push_back(i); // 문자의 인덱스 저장
+ }
+
+ for (int i = 0; i < MAX_ALPHA; i++) { // 각 문자를 포함하는 문자열 확인
+ if (char_idx[i].size() < k) { // 해당 알파벳이 k번 이상 등장하지 않으면 탐색 X
+ continue;
+ }
+ int left = 0, right = k - 1; // 포인터 초기화
+ while (right < char_idx[i].size()) {
+ int tmp_len = char_idx[i][right] - char_idx[i][left] + 1;
+ min_len = min(min_len, tmp_len);
+ max_len = max(max_len, tmp_len);
+ left++; // 윈도우 이동
+ right++;
+ }
+ }
+ return {min_len, max_len};
+}
+/**[백준 20437: 문자열 게임2]
+ * 1. 각 알파벳의 위치 인덱스를 char_idx에 저장
+ * 2. 윈도우의 크기를 k로 설정하고 윈도우를 오른쪽으로 이동시키며
+ * 가장 짧은 문자열과 가장 긴 문자열 탐색
+ * 이때 각 문자열의 길이는 char_idx[i][right] - char_idx[i][left] + 1
+*/
+int main() {
+ int t, k;
+ string w;
+
+ // 입력
+ cin >> t;
+
+ while (t--) {
+ cin >> w >> k;
+
+ // 연산
+ ci ans = solution(w, k);
+
+ // 출력
+ if (ans.second == -1) {
+ cout << -1 << "\n";
+ } else {
+ cout << ans.first << " " << ans.second << "\n";
+ }
+ }
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp" "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp"
new file mode 100644
index 00000000..741e007f
--- /dev/null
+++ "b/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp"
@@ -0,0 +1,46 @@
+#include
+#include
+#include
+
+using namespace std;
+const int MAX_NUM = 100001; //수열 내 숫자 최대값
+
+/**같은 정수를 k개 이하로 포함하는 최장 연속 부분 수열 길이 구하기*/
+int getMaxLen(vector &number, int n, int k) {
+ vector count(MAX_NUM, 0); // 수열 내 각 숫자의 개수 저장
+ int left = 0, right = 0; // 포인터 초기화
+ int max_len = 0; // 최대 수열 길이 초기화
+
+ while (right < n) {
+ // right를 오른쪽으로 옮겨가면서 right번째 숫자를 수열에 추가할 수 있을 지 판단
+ if (count[number[right]] >= k) { // right에 있는 숫자의 개수가 k가 넘으면 -> 추가 불가
+ count[number[left]]--; // left 숫자 삭제
+ left++;
+ } else { // right에 있는 숫자의 개수가 k보다 작으면 -> 추가 가능
+ count[number[right]]++; // right 숫자 추가
+ right++;
+ max_len = max(max_len, right - left); // 최대 수열 길이 갱신
+ }
+ }
+ return max_len;
+}
+/**[백준 20922: 겹치는 건 싫어]
+ * 1. 맨 왼쪽부터 투포인터를 이용해 탐색하며 left와 right 사이에 있는 숫자들의 개수를 count에 저장
+ * 2. 오른쪽에 있는 숫자를 수열에 추가할 수 있으면 추가하고 right++
+ * 3. 오른쪽에 있는 숫자를 수열에 추가할 수 없으면 현재 수열의 맨 왼쪽 숫자를 삭제하고 left 이동
+*/
+int main() {
+ int n, k;
+ vector numbers;
+
+ //입력
+ cin >> n >> k;
+ numbers.assign(n, 0);
+ for (int i = 0; i < n; i++) {
+ cin >> numbers[i];
+ }
+
+ //연산 & 출력
+ cout << getMaxLen(numbers, n, k);
+ return 0;
+}
\ No newline at end of file
diff --git "a/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\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/11_\355\210\254 \355\217\254\354\235\270\355\204\260/\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/12_\355\212\270\353\246\254/README.md" "b/12_\355\212\270\353\246\254/README.md"
index e69de29b..a49a16e2 100644
--- "a/12_\355\212\270\353\246\254/README.md"
+++ "b/12_\355\212\270\353\246\254/README.md"
@@ -0,0 +1,75 @@
+# 트리 (Tree)
+
+[메인으로 돌아가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4)
+
+## 💻 튜터링
+
+### 라이브 코딩
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :-----------------------------------------------------------------------: | :----------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :----------: | :--------: |
+| 1991 | 트리 순회 |
| [바로가기]() | 트리 순회 |
+| 4803 | 트리 |
| [바로가기]() | 트리, DFS |
+
+## ✏️ 과제
+
+### 마감기한
+
+~ 5 / 23 (화) 18:59 - 과제 제출
+~ 5 / 25 (목) 23:59 - 추가 제출
+
+### 필수
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :-----------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :------------------------: |
+| 3190 | 뱀 |
| [C++]() | 구현, 시뮬레이션, 자료구조 |
+| 15681 | 트리와 쿼리 |
| [C++]() | 트리, 그래프 탐색, DP |
+| 5639 | 이진 검색 트리 |
| [C++]() | 트리, 그래프 탐색 |
+
+### 도전
+
+| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
+| :--------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :--: |
+| 1967 | 트리의 지름 |
| [C++]() | 트리, 그래프 탐색 |
+| 24545 | Y |
| [C++]() | 트리 그래프 탐색, DP |
+---
+
+### 힌트
+
+
+뱀
+
+ 뱀의 머리와 꼬리에 변화가 생기고 있네요! 어떤 자료구조가 필요할까요? 뱀의 현재 위치를 직접 나타내보는 것도 좋을 것 같네요.
+
+
+
+
+트리와 쿼리
+
+ 모든 정점을 각각 루트로 하는 서브트리에서의 정점의 수를 빠르게 구해 둘 방법이 무엇일까요? 앞서 배운 알고리즘을 떠올려보세요!
+
+
+
+
+이진 검색 트리
+
+ 전위 순회한 결과를 루트와 왼쪽 오른쪽으로 나눠보고 후위 순회의 순서를 떠올려보세요!
+
+
+
+
+트리의 지름
+
+ 지름을 이루는 노드의 특징은 무엇일까요?
+
+
+
+
+Y
+
+ 사용할 수 있는 정점의 종류를 고려해서 트리의 모양을 추측해보세요! 또 N이 생각보다 큰 것 같아요!
+
+
+
+
+---
diff --git "a/12_\355\212\270\353\246\254/\352\260\225\354\235\230 \354\236\220\353\243\214/12_\355\212\270\353\246\254_\353\254\270\354\240\234\355\225\264\354\204\244.pdf" "b/12_\355\212\270\353\246\254/\352\260\225\354\235\230 \354\236\220\353\243\214/12_\355\212\270\353\246\254_\353\254\270\354\240\234\355\225\264\354\204\244.pdf"
new file mode 100644
index 00000000..2bb1c381
Binary files /dev/null and "b/12_\355\212\270\353\246\254/\352\260\225\354\235\230 \354\236\220\353\243\214/12_\355\212\270\353\246\254_\353\254\270\354\240\234\355\225\264\354\204\244.pdf" differ
diff --git "a/12_\355\212\270\353\246\254/\352\260\225\354\235\230 \354\236\220\353\243\214/12_\355\212\270\353\246\254_\354\235\264\353\241\240.pdf" "b/12_\355\212\270\353\246\254/\352\260\225\354\235\230 \354\236\220\353\243\214/12_\355\212\270\353\246\254_\354\235\264\353\241\240.pdf"
new file mode 100644
index 00000000..e7c5dd8e
Binary files /dev/null and "b/12_\355\212\270\353\246\254/\352\260\225\354\235\230 \354\236\220\353\243\214/12_\355\212\270\353\246\254_\354\235\264\353\241\240.pdf" differ
diff --git "a/12_\355\212\270\353\246\254/\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/12_\355\212\270\353\246\254/\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/12_\355\212\270\353\246\254/\355\225\204\354\210\230/15681.cpp" "b/12_\355\212\270\353\246\254/\355\225\204\354\210\230/15681.cpp"
new file mode 100644
index 00000000..c65eb79c
--- /dev/null
+++ "b/12_\355\212\270\353\246\254/\355\225\204\354\210\230/15681.cpp"
@@ -0,0 +1,48 @@
+#include
+#include
+using namespace std;
+int dfs(int r, vector> &v, vector &visited, vector &cnt){
+ visited[r] = true; //root에 방문 표시
+ int count = 1; //root 노드를를 count에 추가
+
+ for (int next : v[r]) {
+ //범위 기반 for문: for(element_declaration : array)
+ if (visited[next]){
+ continue; //이미 방문한 경우 pass
+ }
+ count += dfs(next, v, visited, cnt); //root의 자식 노드 탐색
+ }
+ cnt[r] = count; //모든 정점을 root로 하는 서브트리에 속한 정점의 수가
+ //cnt[r]에 저장됨
+ return count;
+}
+
+int main()
+{
+ ios::sync_with_stdio(false);
+ cin.tie(NULL); cout.tie(NULL);
+ int n, r, q, v1, v2;
+ //입력
+ cin >> n >> r >> q;
+ vector> v(n+1, vector(0));
+
+ for(int i=0; i> v1 >> v2;
+ v[v1].push_back(v2);
+ v[v2].push_back(v1);
+ }
+
+ //연산
+ vector visited(n+1, false); //방문 표시
+ vector cnt(n + 1, 0); //정점의 수를 세는 벡터 cnt
+
+ cnt[r] = dfs(r, v, visited, cnt);
+
+ //출력
+ for(int i=0; i> r;
+ cout << cnt[r] << '\n';
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git "a/10_\354\235\264\353\266\204 \355\203\220\354\203\211/\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/12_\355\212\270\353\246\254/\355\225\204\354\210\230/3190.cpp"
similarity index 100%
rename from "10_\354\235\264\353\266\204 \355\203\220\354\203\211/\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"
rename to "12_\355\212\270\353\246\254/\355\225\204\354\210\230/3190.cpp"
diff --git "a/12_\355\212\270\353\246\254/\355\225\204\354\210\230/5639.cpp" "b/12_\355\212\270\353\246\254/\355\225\204\354\210\230/5639.cpp"
new file mode 100644
index 00000000..70f197c2
--- /dev/null
+++ "b/12_\355\212\270\353\246\254/\355\225\204\354\210\230/5639.cpp"
@@ -0,0 +1,37 @@
+#include
+#include
+
+using namespace std;
+void calOrder(int start, int end, vector &v){
+ if(start >= end){
+ return;
+ }
+ int idx = start + 1; //idx: start보다 커지는 순간
+ //=> 오른쪽 서브트리가 됨
+ while(idx < end){
+ if(v[start] < v[idx]){ //v[start] < v[idx] 될 때까지 idx++
+ break;
+ }
+ idx++;
+ }
+ calOrder(start+1, idx, v); //left 서브트리
+ calOrder(idx, end, v); //right 서브트리
+ cout << v[start] << "\n"; //root
+}
+
+int main()
+{
+ ios::sync_with_stdio(false);
+ cin.tie(NULL); cout.tie(NULL);
+
+ //입력
+ int n;
+ vector num;
+ while(cin >> n){
+ num.push_back(n);
+ }
+ //연산 & 출력
+ calOrder(0, num.size(), num);
+
+ return 0;
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index f6aae660..45c0fca2 100644
--- a/README.md
+++ b/README.md
@@ -27,9 +27,9 @@ SW학부 원스탑 튜터링에서 진행하는 코딩 테스트 대비 알고
| 2023.03.31 | DFS & BFS | [@kimyu0218](https://github.com/kimyu0218) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/07_DFS%20%26%20BFS/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C/07_DFS%26BFS_%EC%9D%B4%EB%A1%A0.pdf) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/07_DFS%20%26%20BFS) | - |
| 2023.04.07 | 백트래킹 | [@sujeong000](https://github.com/sujeong000) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/08_%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9/%EA%B0%95%EC%9D%98%20%EC%9E%90%EB%A3%8C/08_%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9_%EC%9D%B4%EB%A1%A0.pdf) | [바로가기](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/tree/main/08_%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9) | - |
| 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) | [바로가기]() | [바로가기]() | 녹화 강의 제공 |
-| 2023.05.12 | 투 포인터 | [@kwakrhkr59](https://github.com/kwakrhkr59) | [바로가기]() | [바로가기]() | - |
-| 2023.05.19 | 트리 | [@dbswn](https://github.com/dbswn) | [바로가기]() | [바로가기]() | - |
+| 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) | [바로가기](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) | [바로가기]() | [바로가기]() | - |
| 2023.06.02 | 유니온 파인드 | [@bsa0322](https://github.com/bsa0322) | [바로가기]() | [바로가기]() | 2기 자료 제공 |
| 2023.06.02 | 최소 신장 트리 | [@ZERO-black](https://github.com/ZERO-black) | [바로가기]() | [바로가기]() | 2기 자료 제공 |