[Algorithm] Sort, DFS & BFS
Categories: Algorithm
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
์ ๋ ฌ์๊ณ ๋ฆฌ์ฆ
๋ฒ๋ธ์ ๋ ฌ
๋ฒ๋ธ ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(n^2)
๋ฒ๋ธ์ ๋ ฌ์ ์ฌ์ฉ์ํ๋ ๊ฒ์ด ์ข์ โ ํจ์จ์ด ์ ์ข์
๋ฐ๋ณต๋ฌธ 2๋ฒ ์ฌ์ฉ, ์ค๋ฌด์์ ์ฌ์ฉํ์ง ์์
-
์๋ ๊ฐ๋ค์ ์ ๋ ฌ ํ ์ ์๋๊ฐ ? X โ stableํ์ง ์๋ค. but ๊ธฐ์ค์ ์ ํด์ฃผ๋ฉด ์ ๋ ฌ ๊ฐ๋ฅ
-
์๋ฐ๋ก ๊ตฌํํ ๋ฒ๋ธ ์ ๋ ฌ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public static int[] bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { // ์ธ๋ถ ๋ฃจํfor (int j = 0; j < n - i - 1; j++) { // ๋ด๋ถ ๋ฃจํif (arr[j] > arr[j + 1]) { // ํ์ฌ ์์์ ๋ค์ ์์๋ฅผ ๋น๊ต // ์์น ๊ตํint temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; }
์ ํ์ ๋ ฌ
์ฃผ์ด์ง ๋ชฉ๋ก์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ์ ์ ๋ ฌ๋ ๋ถ๋ถ๊ณผ ๊ตํํ๋ ์ ๋ ฌ ๋ฐฉ๋ฒ
- ์๊ฐ ๋ณต์ก๋: ์ ํ ์ ๋ ฌ์ ํญ์ O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ์ ๋ ฌ ๊ณผ์ ๊ณผ ๊ด๊ณ์์ด ๋น๊ต ํ์๋ ๋์ผ , ์ต์ ์ ๊ฒฝ์ฐ์๋ ์๊ฐ ๋ณต์ก๋๋ O(n^2)
-
stableํ์ง ์๋ค.
-
์๋ฐ๋ก ๊ตฌํํ ์ ํ์ ๋ ฌ
1 2 3 4 5 6 7 8 9 10 11 12 13
public static int[] selectionSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) {// ์ธ๋ถ ๋ฃจํint minIdx = i;// ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ต์๊ฐ ์ธ๋ฑ์ค๋ก ์ค์ for (int j = i + 1; j < n; j++) {// ๋ด๋ถ ๋ฃจํif (arr[j] < arr[minIdx]) {// ํ์ฌ ๊ฐ์ด ์ต์๊ฐ๋ณด๋ค ์๋ค๋ฉด minIdx = j;// ์ต์๊ฐ ์ธ๋ฑ์ค ์ ๋ฐ์ดํธ } } // ํ์ฌ ์ธ๋ฑ์ค์ ์ต์๊ฐ ์ธ๋ฑ์ค์ ๊ฐ ๊ตํint temp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = temp; } return arr; }
์ฝ์ ์ ๋ ฌ
์ฝ์ ์ ๋ ฌ์ ์ฃผ์ด์ง ๋ชฉ๋ก์์ ๊ฐ ์์๋ฅผ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์๋ง์ ์์น์ ์ฝ์ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ชฉ๋ก์ ๋ ๋ถ๋ถ, ์ฆ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ถ๋ถ๊ณผ ์์ง ์ ๋ ฌ๋์ง ์์ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
-
์ ๋ ฌ๋์ง ์์ ๋ถ๋ถ์์ ์์๋ฅผ ์ ํํ๊ณ ์ด๋ฅผ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์๋ง์ ์์น์ ์ฝ์ ํ์ฌ ์ ์ฒด ๋ชฉ๋ก์ ์ ๋ ฌํ๋ ์์ ์ ์ํ
- ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒ์ผ ์๋ก ํจ์จ์ด ์ข์์ง๋ค.
- ์ํ๋ณด๋ค ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ O(n)์ด๋ผ๊ณ ๋ ํจ.
- ๋ฐ์ดํฐ๋ฅผ ๋ฌํํ๊ฒ ์ ๋ ฌํ๊ณ ์ฝ์ ์ ๋ ฌ ํ๋ฉด ์ข๋ค.
์ฝ์ ์ ๋ ฌ์ ์๋ฆฌ
- ๋ชฉ๋ก์ ์ฒซ ๋ฒ์งธ ์์๋ ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
- ๊ทธ ๋ค์ ์์๋ถํฐ ์์ํ์ฌ ์ ๋ ฌ๋์ง ์์ ๋ถ๋ถ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ ํ
- ์ด์ ์ ํํ ์์๋ฅผ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ถ๋ถ์์ ์ ์ ํ ์์น์ ์ฝ์ , ์ฝ์ ์์น๋ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์์์ ๋น๊ตํ์ฌ ๊ฒฐ์ ๋๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์ ์ง์ ์ผ๋ก ํ์ฅํ๋ค.
- ๋ชจ๋ ์์๊ฐ ์ ๋ ฌ๋ ๋๊น์ง ์ด ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณต
-
์๋ฐ๋ก ๊ตฌํํ ์ฝ์ ์ ๋ ฌ
1 2 3 4 5 6 7 8 9 10 11
public static void insertionSort(int[] arr) { int n = arr.length; for (int i = 1; i < n; i++) {// ์ธ๋ถ ๋ฃจํint current_value = arr[i];// ํ์ฌ ์์ ์ ํint j = i - 1; while (j >= 0 && arr[j] > current_value) {// ๋ด๋ถ ๋ฃจํ arr[j + 1] = arr[j];// ์ด์ ์์๋ฅผ ํ์ฌ ์์น๋ก ์ด๋ j--; } arr[j + 1] = current_value;// ํ์ฌ ์์๋ฅผ ์ฌ๋ฐ๋ฅธ ์์น์ ์ฝ์ } }
ํต์ ๋ ฌโจ
- ํต ์ ๋ ฌ์ โ๋ถํ ์ ๋ณตโ ์ ๋ต์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์ฐ๋ฆฌ๊ฐ ์ ๋ ฌํ๋ ค๋ ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ์ ๋ ฌํ๋ ๋ฐ ์ฌ์ฉ
- ์ด ์๊ณ ๋ฆฌ์ฆ์ โ๋น๊ต ์ ๋ ฌโ ๋ฒ์ฃผ์ ์ํ๋ฉฐ, ํ๊ท ์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฅธ ์ํ ์๋๋ฅผ ์๋ํ์ฌ ๋ง์ ๋ถ์ผ์์ ๋๋ฆฌ ํ์ฉ๋๊ณ ์๋ค.
- ํต ์ ๋ ฌ์ ํ๊ท ์๊ฐ ๋ณต์ก๋๋ O(n log n)์ผ๋ก, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์ ์ฐ์ํ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(n^2)๊ฐ ๋ ์ ์๋ค.
- ๊ทธ๋ฌ๋ ํผ๋ฒ ์ ํ ๋ฐฉ๋ฒ์ ์ต์ ํํ๊ฑฐ๋ ๋๋คํ ํผ๋ฒ์ ์ ํํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด, ์ต์
์ ์๋๋ฆฌ์ค์์๋ ํจ์จ์ ์ธ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ํผ๋ฒ์ ๋ฌด์์ผ๋ก ์ก๋๋์ ๋ฐ๋ผ ํจ์จ์ด ๊ธ์ฆํ๊ฑฐ๋ ๊ธ๊ฐํ๋ค.
- ํต์ ๋ ฌ ์ธ๋ ์ ๋ ฌ์ด ๋์ด์๋ค๊ณ ํ๋ค๋ฉด ๋๋ณด๋ค ๊ฐ์ด๋ฐ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข๋ค.
- ์ ๋ ฌํ ์ซ์์ ๊ฐ์ฅ ๊ฐ์ด๋ฐ ์ซ์๋ฅผ ํผ๋ฒ์ผ๋ก ๊ณ ๋ฅด๋ฉด ์ข์
- ํต ์ ๋ ฌ์ ๋ด๋ถ ์ ๋ ฌ, ์ธ๋ถ ์ ๋ ฌ ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ
ํต ์ ๋ ฌ์ ๋์ ์๋ฆฌ
- ๋ฆฌ์คํธ์์ ํ๋์ ์์๋ฅผ โํผ๋ฒโ์ผ๋ก ์ ์ ํฉ๋๋ค. ํผ๋ฒ์ ๋ฆฌ์คํธ์ ์ค์ ์์์ผ ์๋ ์๊ณ , ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ํํ ์ ์๋ค.
- ์ ํ๋ ํผ๋ฒ์ ์ค์ฌ์ผ๋ก, ์์ ๊ฐ์ ํผ๋ฒ์ ์ผ์ชฝ์, ํฐ ๊ฐ์ ํผ๋ฒ์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์น โ ์ด ๋จ๊ณ๋ฅผ ๋ฆฌ์คํธ์ โ๋ถํ โ์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ ๊ฒ ๋ถํ ๋ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ์ ๋ํด ๊ฐ์ ๊ณผ์ ์ ์ฌ๊ท์ ์ผ๋ก ์ํ. ์ฆ, ๋ถ๋ถ ๋ฆฌ์คํธ์์ ๋ค์ ํผ๋ฒ์ ์ ์ ํ๊ณ ๋ถํ ํฉ๋๋ค.
- ๋ถ๋ถ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 1 ์ดํ๊ฐ ๋ ๋๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ํฌ๊ธฐ๊ฐ 1 ์ดํ์ธ ๋ฆฌ์คํธ๋ ์ด๋ฏธ ์ ๋ ฌ๋์๋ค๊ณ ๊ฐ์ฃผ
- ๋ชจ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋๋ฉด, ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๊ฒฐํฉํ์ฌ ์ ์ฒด ์ ๋ ฌ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
-
์๋ฐ๋ก ๊ตฌํํ ํต ์ ๋ ฌ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
public static List<Integer> quickSort(List<Integer> arr) { if (arr.size() <= 1) {// ์ฌ๊ท ์ข ๋ฃ ์กฐ๊ฑด: ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1 ์ดํ๋ฉด ์ข ๋ฃreturn arr; } int pivot = arr.get(arr.size() / 2);// ํผ๋ฒ ์ ํ List<Integer> left = new ArrayList<>(); List<Integer> equal = new ArrayList<>(); List<Integer> right = new ArrayList<>(); for (int num : arr) { if (num < pivot) { left.add(num); } else if (num > pivot) { right.add(num); } else { equal.add(num); } } List<Integer> sortedLeft = quickSort(left); List<Integer> sortedRight = quickSort(right); sortedLeft.addAll(equal); sortedLeft.addAll(sortedRight); return sortedLeft; }
๋ณํฉ์ ๋ ฌ
- ๋ณํฉ ์ ๋ ฌ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ๋๋ ๋ค, ์ด๋ค์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ๊ณ ๋ค์ ํฉ์น๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ด ๊ณผ์ ์์๋ โ๋ถํ (Divide)โ๊ณผ โ๋ณํฉ(Merge)โ ๋ ๊ฐ์ง ๋จ๊ณ๊ฐ ํฌํจ๋์ด ์๋ค. ์ด๋ฌํ ๋จ๊ณ๋ค์ ์ํ์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉฐ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํด๋๊ฐ
๋ณํฉ ์ ๋ ฌ์ ๋์ ์๋ฆฌ
- ๋ถํ (Divide): ์ฃผ์ด์ง ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ๋๋๋ค. ์ด ๋ถํ ๊ณผ์ ์ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 1 ์ดํ๊ฐ ๋ ๋๊น์ง ๊ณ์ํด์ ์ด๋ฃจ์ด์ง๋๋ค. ๊ฐ ๋ถํ ๋จ๊ณ์์๋ ๋ฆฌ์คํธ๊ฐ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
- ์ ๋ณต(Conquer): ๋ถํ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌ. โ ์ด๋ ๊ฐ ๋ถ๋ถ ๋ฆฌ์คํธ์ ๋ํด ์ํ์ ์ผ๋ก ๋ถํ ๊ณผ ๋ณํฉ ๊ณผ์ ์ ์ํํจ์ผ๋ก์จ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๋ฅผ ์ ์ ์ค์ฌ ๋๊ฐ๋ฉฐ ์ ๋ ฌ์ ์ํํ๋ค.
- ๋ณํฉ(Merge): ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ค์ ํฉ์ณ ์ต์ข ์ ์ผ๋ก ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค. ์ด ๋ณํฉ ๊ณผ์ ์์๋ ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ค์ ์ฐจ๋ก๋๋ก ๋น๊ตํ์ฌ ์์ ์์๋ถํฐ ์๋ก์ด ๋ฆฌ์คํธ์ ํฉ์น๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
-
์๋ฐ๋ก ๊ตฌํํ ๋ณํฉ์ ๋ ฌ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
public static List<Integer> mergeSort(List<Integer> arr) { if (arr.size() <= 1) {// ์ฌ๊ท ์ข ๋ฃ ์กฐ๊ฑด: ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1 ์ดํ๋ฉด ์ข ๋ฃreturn arr; } int mid = arr.size() / 2;// ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ๋ถํ List<Integer> left = new ArrayList<>(arr.subList(0, mid)); List<Integer> right = new ArrayList<>(arr.subList(mid, arr.size())); left = mergeSort(left);// ์ผ์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌ right = mergeSort(right);// ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌreturn merge(left, right);// ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฆฌ์คํธ ๋ณํฉ } public static List<Integer> merge(List<Integer> left, List<Integer> right) { List<Integer> merged = new ArrayList<>(); int leftIdx = 0; int rightIdx = 0; // ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์์๋๋ก ๋น๊ตํ๋ฉด์ ์์ ์์๋ฅผ ๋ณํฉwhile (leftIdx < left.size() && rightIdx < right.size()) { if (left.get(leftIdx) < right.get(rightIdx)) { merged.add(left.get(leftIdx)); leftIdx++; } else { merged.add(right.get(rightIdx)); rightIdx++; } } // ๋จ์ ์์๋ค์ ๋ณํฉwhile (leftIdx < left.size()) { merged.add(left.get(leftIdx)); leftIdx++; } while (rightIdx < right.size()) { merged.add(right.get(rightIdx)); rightIdx++; } return merged; }
DFS ์ BFS
๊ทธ๋ํ ์ํ๋ ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ์ฐ์ฐ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊น์ด ์ฐ์ ํ์(DFS)๊ณผ ๋๋น ์ฐ์ ํ์(BFS)์ด ์ฌ์ฉ๋๋ค.
๋์ด ์ฐ์ ํ์์ ๊ฐ ์ ์๋ ๊ธธ์ ๋จผ์ ๊ฐ๋ค.
DFS์ BFS ๋ชจ๋ ์ง๋์จ ๊ธธ์ ์ํ ๊ด๋ฆฌ๋ฅผ ํด์ผ ํ๋ค - ๊ธฐ๋ก ํ์, ๊ฐ๋ค ์จ ๊ธธ์ ์ฒดํฌํ ์ ์์ด์ผ ํจ
DFS (Depth First Search, DFS)
- ์์ ์ ์ ์์๋ถํฐ ์ต๋ํ ๊น์์ด ํ์์ ์งํํ๊ณ ๋ ์ด์ ํ์์ด ๋ถ๊ฐ๋ฅ ํ ๋ ์ด์ ๋จ๊ณ๋ก ๋์์ ๋ค์ ๋ถ๊ธฐ๋ก ํ์์ ์งํํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ฆ, ํ ๋ถ๊ธฐ๋ฅผ ํ์ํ ํ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ค.
- DFS์์๋ ๊น์ด๊ฐ ์์ผ๋ฉด ์์ ๊ฒ์ ๋ค์ ์ ํํด์ผํ๋ฏ๋ก Backtracking์ ์ฌ์ฉํ๋ค
- DFS๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
- ์ฌ๊ท ๋๋ Stack์ ์ฌ์ฉ
์ฌ๊ท๋ ๋ฌด์กฐ๊ฑด ํ์ถ ์กฐ๊ฑด์ด ์์ด์ผ ํจ.
์ฌ๊ธฐ์๋ if(์์ ์ ์ ๊ณผ ๋์ฐฉ ์ ์ ์ด ๊ฐ๋ค๋ฉด)์ด ํ์ถ๊ตฌ
์ฌ๊ท๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญ๋๊ฒ ์ฌ์ฉํ๋ค. = ์ค๋ฌด์์ ๋ณ๋ชฉ ํ์ ์๊ฒจ์ ์ ๋ ์ฐ๋ฉด ์๋จ, ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์๋ง ํ๊ธฐ
์ฌ๊ท์ ์ ๊ทผ ๋ฐฉ๋ฒ
DFS๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฐฉ๋ฌธํ ์ ์ ์ ํ์ํ๊ธฐ ์ํ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
- ํ์ฌ ์ ์ ์ ํ์ธํฉ๋๋ค. ์ต์ด ์คํ์์๋ ์ผ๋ฐ์ ์ผ๋ก root(์ต์์ ๋ ธ๋)๋ถํฐ ํ์์ ์์ํฉ๋๋ค.
- ํด๋น ํ์ฌ ์ ์ ์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ฒดํฌํฉ๋๋ค. (๋ฐฉ๋ฌธํ๋ค๊ณ ํ๊ธฐ ๋ณ๊ฒฝ)
- ํ์ฌ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ์ด ์๋์ง ํ์ธํ๊ณ , ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
- ์ธ์ ํ ์ ์ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ด ์๋ค๋ฉด, ํด๋น ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๊ณ 2~5๋ฒ ๊ณผ์ ์ ์ฌ๊ท ํธ์ถํ์ฌ ํด๋น ์ ์ ์ ํ์ฌ ์ ์ ์ผ๋ก ์ค์ ํฉ๋๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง 2~5 ๋จ๊ณ๋ฅผ ๋ฐ๋ณต
BFS
- ๋๋น ์ฐ์ ํ์์ ํ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ์ธ์ ํ ๋ชจ๋ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ ํ, ๋ฐฉ๋ฌธํ ์ ์ ์ ์๋ก์ด ๊ธฐ์ค์ผ๋ก ์ค์ ํ์ฌ ์ด์ ์ธ์ ํ ์ ์ ๋ค์ ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์ ํ์
- ์ฃผ๋ก ํ(Queue)๋ผ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๊ตฌํ
- ๋์ ์๋ฆฌ
- ์์ ์ ์ ์ ํ์ ๋ฃ๊ณ , ํด๋น ์ ์ ์ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์
- ํ๊ฐ ๋น ๋๊น์ง ๋ค์์ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ค.
- ํ์์ ํ๋์ ์ ์ ์ ๊ฐ์ ธ์ ํ์ฌ ์ ์ ์ผ๋ก ์ค์
- ํ์ฌ ์ ์ ๊ณผ ์ธ์ ํ ๋ชจ๋ ์ ์ ๋ค์ ๊ฒํ
- ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ์ ์ ๋ค์ ๋ชจ๋ ํ์ ๋ฃ๊ณ , ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์
- (๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด์ ๊ฐ๋ค์จ ๊ธธ์ true๋ก ์ฒดํฌํ๊ณ false์ผ ๋๋ง ์ด๋)
- ํ๊ฐ ๋น์์ ๋ ํ์์ ์ข ๋ฃ
BFS๋ฅผ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํด์ผ ํ๋ ๋ฌธ์ ์์ DFS๋ BFS ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉ ๊ฐ๋ฅ
- ์ฃผ์ ๋ชฉํ๊ฐ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด๋ผ๋ฉด, ๋ ์ค์์ ํธํ ๊ฒ์ ์ ํํ๋ฉด ๋๋ค.
- ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ผ ํ๋ ๋ฌธ์
- ์๋ฅผ ๋ค์ด, ๋ฏธ๋ก ์ฐพ๊ธฐ์ ๊ฐ์ด ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ผ ํ๋ ์ํฉ์์๋ BFS๊ฐ ์ ์ฉ.
- DFS๋ก ๊ฒฝ๋ก๋ฅผ ๊ฒ์ํ ๊ฒฝ์ฐ ์ฒ์์ผ๋ก ๋ฐ๊ฒฌ๋๋ ํด๊ฒฐ์ฑ ์ด ๋ฐ๋์ ์ต๋จ ๊ฒฝ๋ก๋ผ๋ ๋ณด์ฅ์ด ์์.
- ๊ทธ๋ฌ๋ BFS๋ ํ์ฌ ๋ ธ๋์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ์ฒ์์ผ๋ก ๋ฐ๊ฒฌ๋๋ ํด๊ฒฐ์ฑ ์ด ๋ฐ๋ก ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค.
- ๊ฒ์ ๋์์ด ํฌ์ง ์๊ณ , ๊ฒ์์ ์์์ ์์ ์ํ๋ ๋์์ด ๋ฉ์ง ์์ ๊ฒฝ์ฐ
- ์ต๋จ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค๋ฉด, ํ๋์ ๊ฒฝ๋ก๊ฐ ๋ฌดํํ ์ด์ด์ง๋๋ผ๋ BFS๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๊ฒํ ํ๋ฏ๋กย ๋ฐ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ค.
BFS
ย ํ์ฉ์ ์ฃผ์ํ ์
- ๊ทธ๋ํ์ ํฌ๊ธฐ์ ๋ฐ๋์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋ค.
- ๊ทธ๋ํ์ ํฌ๊ธฐ๋ ๋ฐ๋๊ฐ ์ปค์ง์๋ก, ์ฆ ์ ์ ์ด๋ ๊ฐ์ ์ ๊ฐ์๊ฐ ๋ง์์ง์๋ก BFS์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ๋ฐฉ๋ฌธํ ์ ์ ๋ค์ ์ ์ฅํด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฌ๋ค.
- BFS๋ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฌธํ ์ ์ ๋ค์ ์ ์ฅํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๊ทธ๋ํ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก, ํ์ ์ ์ฅ๋๋ ์ ์ ์ ์๋ ๋์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ปค์ง๋ค. ์ด ๊ฒฝ์ฐ, BFS๋ณด๋ค๋ DFS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์ง
- BFS๋ ์์์ ์์ ๋๋ฌ ๊ฐ๋ฅํ ์ ์ ๋ค๋ง ํ์
- BFS๋ ์์์ ์์ ๋๋ฌํ ์ ์๋ ์ ์ ์ ํ์ํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์์์ ์์ ๋๋ฌ ๊ฐ๋ฅํ ์ ์ ๋ค๋ง ํ์ํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค.
- BFS๋ โ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ์๋ฃ๊ตฌ์กฐโ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- BFS์์๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ์ โ ์ด๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* BFS ์ธ์ ํ๋ ฌ : ๋๋น ์ฐ์ ํ์์ ๊ตฌํํ ํ
ํ๋ฆฟ ์์
*
* @param array : ๊ฐ ์ ์ ์ ํ/์ด๋ก ํ๊ณ , ์ฐ๊ฒฐ๋ ์ ์ ์ 1๋ก, ์ฐ๊ฒฐ๋์ง ์์ ์ ์ ์ 0์ผ๋ก ํ๊ธฐํ๋ 2์ฐจ์ ๋ฐฐ์ด
* @param visited : ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์ธ์ ์ํ ๋ฐฐ์ด
* @param src : ๋ฐฉ๋ฌธํ ์ ์
* @param result : ๋ฐฉ๋ฌธํ๋ ์ ์ ๋ฆฌ์คํธ๋ฅผ ์ ์ฅํ List
*
**/public ArrayList<Integer> bfs_array(int[][] array, boolean[] visited, int src, ArrayList<Integer> result) {
//bfs์ ๊ฒฝ์ฐ ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Queue<Integer> queue = new LinkedList<>();
//์์ ์ง์ ์ ํ์ ๋ฃ์ด์ฃผ๊ณ , ํด๋น ๋ฒํ์ค์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
queue.offer(src);
visited[src] = true;
//ํ์ ๋์ด์ ๋ฐฉ๋ฌธํ ์์๊ฐ ์์ ๊ฒฝ์ฐ๊น์ง ๋ฐ๋ณตํฉ๋๋ค.while (!queue.isEmpty()) {
//ํ์ฌ ์์น๋ฅผ ํ์์ ๊บผ๋ธ ํint cur = queue.poll();
// ํ์ฌ ๋ฐฉ๋ฌธํ ์ ์ ์ result์ ์ฝ์
ํฉ๋๋ค.
result.add(cur);
//์ ์ฒด ๋ฐฐ์ด์์ ํ์ฌ ๋ฒํ์ค์ ํ๋ง ํ์ธํฉ๋๋ค.for (int i = 0; i < array[cur].length; i++) {
//๊ธธ์ด ์กด์ฌํ๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ ๊ฒฝ์ฐif(adjArray[cur][i] == 1 && !visited[i]) {
//ํ์ ํด๋น ๋ฒํ์ค์ ์์น๋ฅผ ๋ฃ์ด์ค ์ดํ
queue.offer(i);
//๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํฉ๋๋ค.
visited[i] = true;
}
}
}
//์ด์ด์ง ๋ชจ๋ ๊ธธ์ ์ํํ ํ ๋ฐฉ๋ฌธ ์ฌ๋ถ๊ฐ ๋ด๊ธด ArrayList๋ฅผ ๋ฐํํฉ๋๋ค.return result;
}
Leave a comment