์๊ณ ๋ฆฌ์ฆ์ ๋ฐฐ์ฐ๊ธฐ ์ , ์ฝ๋ ์นดํ๋ฅผ ํตํด ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ดค๋๋ฐ,
๋ฐฐ์ฐ๊ณ ๋ ํ ์กฐ๊ธ ๋ ์ดํด๊ฐ ์๋๋ค!
์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ด
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
ํ์ ์๊ณ ๋ฆฌ์ฆ
๊ณ ๊ธ ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ ํด๊ฒฐ ์ ๋ต๊ณผ ์ค์ ์ฐ์ต
์ผ์์ฐฌ ํํฐ๋
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋จ๊ณ์ ์ธ ๋ฐฉ๋ฒ
ํจ์จ์ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค์ฐ ์ค์.
๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ ์๊ณ ๋ฆฌ์ฆ ์ค, ํจ์จ์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ด ์ข๋ค.
์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ฑ์ ๋ํ๋ด๋ ํ๊ธฐ๋ฒ.
์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ์ผ๋ง๋ ๋ง์ ์๊ฐ์ด๋ ๊ณต๊ฐ์ ํ์๋ก ํ๋์ง ์ค๋ช .
์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ ค!
ํ๊ธฐ๋ฒ ๊ณ์ฐ
์์ ๋ฒ๋ฆฌ๊ธฐ
์๊ฐ ๋ณต์ก๋์์ ๊ฐ์ฅ ํฐ ์ํฅ์ ์ฃผ๋ ํญ๋ชฉ์ ์ค์ฌ์ผ๋ก ์ฒดํฌ.
์์ ํญ๋ชฉ์ด๋, ๋ฎ์ ์ฐจ์์ ํญ๋ชฉ์ ๋ฒ๋ฆผ.
e.g.,
O(2n), O(3n^2) -> O(n), O(n^2)
์ต๊ณ ์ฐจ์ ํญ๋ชฉ๋ง ๋จ๊ธฐ๊ธฐ
๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๋ ํญ๋ชฉ์ ์ด์ .
๊ฐ์ฅ ํฐ ์ฐจ์์ ํญ๋ชฉ์ ๋จ๊ธฐ๊ณ , ๋๋จธ์ง๋ ๋ฒ๋ฆฐ๋ค.
e.g.,
O(n^2 + n) -> O(n^2)
๋คํญ์์ ๊ฒฝ์ฐ ์ต๊ณ ์ฐจ์ ํญ๋ชฉ๋ง ๊ณ ๋ ค
๋คํญ์์ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๋ ํญ๋ชฉ์ ์ด์ .
์์ํญ, ๋ฎ์ ์ฐจ์์ ํญ๋ชฉ์ ๋ฌด์.
e.g.,
O(3n^3 + 5n^2 + 2n + 7) -> O(n^3)
์ฐ์ฐ์ ์์ ๋ฌด์
์ฐ์ฐ์, ์์ ๊ฐ ๋ฌด์.
e.g.,
O(3n^2 + 4n +2) -> O(n^2)
์๊ณ ๋ฆฌ์ฆ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ.
์ค์ ์๊ฐ์ด ์๋, ์ ๋ ฅ ํฌ๊ธฐ์ ๋ํ ์ฐ์ฐ ํ์
Big - O ํ๊ธฐ๋ฒ ์ฌ์ฉํ์ฌ ํ์.
e.g.,
int sum(int n)
{
int sum = 0;
for (int i= 0; i < n; i++)
{
sum += i;
}
return sum;
}
for ๋ฃจํ๊ฐ i = 0 ๋ถํฐ ์ ๋ ฅ๊ฐ n ๊น์ง ์ํ๋ฅผ ๋๋ฉฐ, sum์ i ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์.
์๊ฐ ๋ณต์ก๋๋ O(n) -> n์ด๋ผ๋ ๋ณ์๋ฅผ ๋ฐ์์, n๋งํผ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ.
e.g.,
void PrintPairs(int n)
{
for(int i= 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
Console.WriteLine(i + ", " + j);
}
}
}
for ๋ฃจํ๊ฐ ๋ ๊ฐ ์ค์ฒฉ. ๊ฐ ๋ฃจํ๋ 0๋ถํฐ n๊น์ง ์ํ,
์ ์ฒด ์ฐ์ฐ ํ์๋ n^2, ์๊ฐ ๋ณต์ก๋๋ O(n^2)
e.g.,
int Fibonacci(int n)
{
if (n <= 1)
{
return n;
else
{
return Fibonacci(n - 1) + (n - 2);
}
}
์ฌ๊ท์ ์ผ๋ก ํผ๋ณด๋์น ์์ด ๊ณ์ฐ. ๊ฐ ํธ์ถ๋ง๋ค ๋ ๋ฒ์ ์ฌ๊ท ํธ์ถ ์ํ
-> ์๊ฐ ๋ณต์ก๋๋ O(2^n)
๋งค์ฐ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ.
์ฝ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ(๋ฐ์ดํธ)๋ก ์ธก์ ํ๋ ๊ฒ์ด ์๋,
์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ํ์ํ ์ ์ฅ ๊ณต๊ฐ์ ์์ ์ธก์ ํ๋ ์ด์ ๋ฅผ ์ค๋ช .
e.g.,
// ์๊ฐ ๋ณต์ก๋: O(n)
int FindMax(int[] arr)
{
int max = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
return max;
}
// ์๊ฐ ๋ณต์ก๋: O(n^2)
int FindMax2(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
bool isMax = true;
for (int j = 0; j < arr.Length; j++)
{
if (arr[j] > arr[i])
{
isMax = false;
break;
}
}
if (isMax)
{
return arr[i];
}
}
return -1;
}
int[] arr = new int[] { 1, 2, 3, 4, 5 };
// FindMax ๋ฉ์๋์ ์๊ฐ ๋ณต์ก๋: O(n), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
int max = FindMax(arr);
// ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๋น๋กํ์ฌ ์คํ ์๊ฐ์ด ์ฆ๊ฐํ๋ฏ๋ก O(n)์ด๋ผ ํ ์ ์๋ค.
// ๋ํ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ผ ํ ์ ์๋ค.
// FindMax2 ๋ฉ์๋์ ์๊ฐ ๋ณต์ก๋: O(n^2), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
int max2 = FindMax2(arr);
// ์ด์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ์ ๊ณฑ์ ๋น๋กํ์ฌ ์คํ ์๊ฐ์ด ์ฆ๊ฐํ๋ฏ๋ก O(n^2)์ด๋ผ ํ ์ ์๋ค.
// ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ผ ํ ์ ์๋ค.
๋ ๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ฐ๊ธฐ ๋๋ฌธ! (๋ฐ์์จ ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ.)
e.g.,
public static int[] RemoveDuplicates(int[] array)
{
List<int> distinctList = new List<int>();
foreach (int num in array)
{
if (!distinctList.Contains(num))
{
distinctList.Add(num);
}
}
return distinctList.ToArray();
}
์๊ฐ ๋ณต์ก๋ O(n), ๊ณต๊ฐ ๋ณต์ก๋ O(n)
์ฃผ์ด์ง ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํน์ ์์๋ก ๋ฐฐ์ดํ๋ ๋ฐฉ๋ฒ
๋ฐฐ์ด์์ ์ต์๊ฐ(์ต๋๊ฐ)์ ์ฐพ์ ๋งจ ์(๋งจ ๋ค)์ ๊ตํํ๋ ๋ฐฉ๋ฒ.
์๊ฐ ๋ณต์ก๋ : ์ต์ ์ ๊ฒฝ์ฐ, ํ๊ท ์ ๊ฒฝ์ฐ = O(n^2)
๊ณต๊ฐ ๋ณต์ก๋ : O(1) (์์ ํฌ๊ธฐ์ ์ถ๊ฐ ๊ณต๊ฐ์ด ํ์ํ์ง ์์.)
int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
for (int i = 0; i < arr.Length - 1; i++)
{
int minIndex = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
foreach (int num in arr)
{
Console.Write(num);
}
123456
์ ๋ ฌ๋์ง ์์ ๋ถ๋ถ์์ ์์๋ฅผ ๊ฐ์ ธ์ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์ ์ ํ ์์น์ ์ฝ์ .
์๊ฐ ๋ณต์ก๋ : ์ต์ = O(n^2), ์ ๋ ฌ = O(n)
๊ณต๊ฐ ๋ณต์ก๋ : O(1) (์์ ํฌ๊ธฐ์ ์ถ๊ฐ ๊ณต๊ฐ์ด ํ์ํ์ง ์์.)
int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
for (int i = 1; i < arr.Length; i++)
{
int j = i - 1;
int key = arr[i];
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
foreach (int num in arr)
{
Console.WriteLine(num);
}
void QuickSort(int[] arr, int left, int right)
{
if (left < right)
{
int pivot = Partition(arr, left, right);
QuickSort(arr, left, pivot - 1);
QuickSort(arr, pivot + 1, right);
}
}
int Partition(int[] arr, int left, int right)
{
int pivot = arr[right];
int i = left - 1;
// left์ ์๋ ๊ฐ์ด i๋ณด๋ค ์์ผ๋ฉด,
for (int j = left; j < right; j++)
{
if (arr[j] < pivot)
{
i++;
Swap(arr, i, j);
}
}
Swap(arr, i + 1, right);
return i + 1;
}
void Swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
QuickSort(arr, 0, arr.Length - 1);
foreach (int num in arr)
{
Console.WriteLine(num);
}
void MergeSort(int[] arr, int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);
Merge(arr, left, mid, right);
}
}
void Merge(int[] arr, int left, int mid, int right)
{
int[] temp = new int[arr.Length];
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right)
{
if (arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while (i <= mid)
{
temp[k++] = arr[i++];
}
while (j <= right)
{
temp[k++] = arr[j++];
}
for (int l = left; l <= right; l++)
{
arr[l] = temp[l];
}
}
int[] arr = new int[] { 5, 2, 4, 6, 1, 3 };
MergeSort(arr, 0, arr.Length - 1);
foreach (int num in arr)
{
Console.WriteLine(num);
}
๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์ ์์๋ค์ ์ ๋ ฌํ๋ ๋ฉ์๋.
์ค๋ฆ์ฐจ์์ผ๋ก ์ํ, ์๋ฃํ์ ๋ฐ๋ผ ๋ค์ํ ์ ๋ ฌ ๊ธฐ์ค์ ์ฌ์ฉํ ์ ์๋ค.
์๋์ ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ๋ฅผ ์ง์ ์์ ํ๋ฏ๋ก, ๋ฐํ๊ฐ์ด ์๋ค.
// ์ ์ ๋ฐฐ์ด ์ ๋ ฌ ์์
int[] numbers = { 5, 2, 8, 3, 1, 9, 4, 6, 7 };
Array.Sort(numbers);
Console.WriteLine(string.Join(", ", numbers));
// ๋ฌธ์์ด ๋ฆฌ์คํธ ์ ๋ ฌ ์์
List<string> names = new List<string> { "John", "Alice", "Bob", "Eve", "David" };
names.Sort();
Console.WriteLine(string.Join(", ", names));
์ฃผ์ด์ง ๋ฐ์ดํฐ ์งํฉ์์ ํน์ ํญ๋ชฉ์ ์ฐพ๋ ๋ฐฉ๋ฒ ์ ๊ณต.
๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ํ๋์ฉ ์ฐจ๋ก๋๋ก ๊ฒ์ฌ, ์ํ๋ ํญ๋ชฉ ์ฐพ์. (์ฒ์๋ถํฐ ๋๊น์ง ๋น๊ต, ๋ฐฐ์ด ์ ๋ ฌ X)
int SequentialSearch(int[] arr, int target)
{
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == target)
{
return i;
}
}
return -1;
}
์ ๋ ฌ๋ ๋ฐฐ์ด์์ ๋น ๋ฅด๊ฒ ์ํ๋ ํญ๋ชฉ ์ฐพ๋ ๋ฐฉ๋ฒ. (๋ฐฐ์ด์ด ์ ๋ ฌ๋๋ฉด ์ฌ์ฉ!)
์ค๊ฐ ์์์ ์ฐพ๋ ํญ๋ชฉ ๋น๊ต, ๋น๊ต ๋์์ด ์์ผ๋ฉด ์ผ์ชฝ, ํฌ๋ฉด ์ค๋ฅธ์ชฝ ํ์
์๊ฐ ๋ณต์ก๋ : ์ต์ = O(log n)
int BinarySearch(int[] arr, int target)
{
int left = 0;
int right = arr.Length - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] == target)
{
return mid;
}
else if (arr[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
์ ์ (Vertex) ๊ฐ์ (Edge) ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ ๊ตฌ์กฐ
๋ฐฉํฅ ๊ทธ๋ํ(Directed Graph), ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(Undirected Graph)
๊ฐ์ค์น ๊ทธ๋ํ(Weighted Graph) ๊ฐ์ ์ ๊ฐ์ค์น ์์.
ํธ๋ฆฌ๋ ๊ทธ๋ํ๋ฅผ ํ์. ๋ฃจํธ์์ ์์, ๊ฐ๋ฅํ ๊น์ด ๋ค์ด๊ฐ ๋ ธํธ๋ฅผ ํ์, ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์ด์ ๋ ธ๋๋ก ๋์๊ฐ๋ค.
ํธ๋ฆฌ๋ ๊ทธ๋ํ๋ฅผ ํ์. ๋ฃจํธ์์ ์์, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธํธ๋ถํฐ ๋ฐฉ๋ฌธ ํ ๋ค์ ๋ ๋ฒจ ๋ ธ๋ ๋ฐฉ๋ฌธ.
using System;
using System.Collections.Generic;
public class Graph
{
private int V; // ๊ทธ๋ํ์ ์ ์ ๊ฐ์
private List<int>[] adj; // ์ธ์ ๋ฆฌ์คํธ
public Graph(int v)
{
V = v;
adj = new List<int>[V];
for (int i = 0; i < V; i++)
{
adj[i] = new List<int>();
}
}
public void AddEdge(int v, int w)
{
adj[v].Add(w);
}
public void DFS(int v)
{
bool[] visited = new bool[V];
DFSUtil(v, visited);
}
private void DFSUtil(int v, bool[] visited)
{
visited[v] = true;
Console.Write($"{v} ");
foreach (int n in adj[v])
{
if (!visited[n])
{
DFSUtil(n, visited);
}
}
}
public void BFS(int v)
{
bool[] visited = new bool[V];
Queue<int> queue = new Queue<int>();
visited[v] = true;
queue.Enqueue(v);
while (queue.Count > 0)
{
int n = queue.Dequeue();
Console.Write($"{n} ");
foreach (int m in adj[n])
{
if (!visited[m])
{
visited[m] = true;
queue.Enqueue(m);
}
}
}
}
}
public class Program
{
public static void Main()
{
Graph graph = new Graph(6);
graph.AddEdge(0, 1);
graph.AddEdge(0, 2);
graph.AddEdge(1, 3);
graph.AddEdge(2, 3);
graph.AddEdge(2, 4);
graph.AddEdge(3, 4);
graph.AddEdge(3, 5);
graph.AddEdge(4, 5);
Console.WriteLine("DFS traversal:");
graph.DFS(0);
Console.WriteLine();
Console.WriteLine("BFS traversal:");
graph.BFS(0);
Console.WriteLine();
}
}
ํ๋์ ์์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง ์ต๋จ ๊ฒฝ๋ก ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ. ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ
using System;
class DijkstraExample
{
static int V = 6; // ์ ์ ์ ์
// ์ฃผ์ด์ง ๊ทธ๋ํ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
static void Dijkstra(int[,] graph, int start)
{
int[] distance = new int[V]; // ์์ ์ ์ ์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
bool[] visited = new bool[V]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด
// ๊ฑฐ๋ฆฌ ๋ฐฐ์ด ์ด๊ธฐํ
for (int i = 0; i < V; i++)
{
distance[i] = int.MaxValue;
}
distance[start] = 0; // ์์ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ 0
// ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง ๋ฐ๋ณต
for (int count = 0; count < V - 1; count++)
{
// ํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ๋ค ์ค์์ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ ์ ์ฐพ์
int minDistance = int.MaxValue;
int minIndex = -1;
for (int v = 0; v < V; v++)
{
if (!visited[v] && distance[v] <= minDistance)
{
minDistance = distance[v];
minIndex = v;
}
}
// ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ ์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[minIndex] = true;
// ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ๋ค์ ๊ฑฐ๋ฆฌ ์
๋ฐ์ดํธ
for (int v = 0; v < V; v++)
{
if (!visited[v] && graph[minIndex, v] != 0 && distance[minIndex] != int.MaxValue && distance[minIndex] + graph[minIndex, v] < distance[v])
{
distance[v] = distance[minIndex] + graph[minIndex, v];
}
}
}
// ์ต๋จ ๊ฒฝ๋ก ์ถ๋ ฅ
Console.WriteLine("์ ์ \t๊ฑฐ๋ฆฌ");
for (int i = 0; i < V; i++)
{
Console.WriteLine($"{i}\t{distance[i]}");
}
}
static void Main(string[] args)
{
int[,] graph = {
{ 0, 4, 0, 0, 0, 0 },
{ 4, 0, 8, 0, 0, 0 },
{ 0, 8, 0, 7, 0, 4 },
{ 0, 0, 7, 0, 9, 14 },
{ 0, 0, 0, 9, 0, 10 },
{ 0, 0, 4, 14, 10, 0 }
};
int start = 0; // ์์ ์ ์
Dijkstra(graph, start);
}
}
์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ์ด ์๋ ๊ทธ๋ํ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ. ์์ ์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ ํ์ง ๊ฐ๋ฅ.
ํน์ ๋ชฉ์ ์ง๊น์ง ์ต๋จ ๊ฒฝ๋ก ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ. ํด๋ฆฌ์คํฑ ํจ์ ์ฌ์ฉ, ๊ฐ ์ ์ ๊น์ง์ ์์ ๋น์ฉ ๊ณ์ฐ, ๊ฐ์ฅ ๋ฎ์ ๋น์ฉ ๊ฐ์ง ์ ์ ์ ํ ํ ํ์.
ํฐ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋ถํ ํ์ฌ ํธ๋ ์ ๊ทผ๋ฐฉ์.
์์ ํ์ ๋ฌธ์ ์ ํด๊ฒฐ๋ฐฉ๋ฒ ๊ณ์ฐ ํ ์ ์ฅ, ์ด๋ฅผ ์ด์ฉํ์ฌ ํฐ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋์ถ. -> Memoization
์ค๋ณต๋๋ ํ์ ๋ฌธ์ ๋ค์ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ.
์ฌ๊ท์ ๊ตฌ์กฐ ๊ฐ์ง.
ํํฅ์ (Top-Down), ์ํฅ์ (Bottom-Up)
// ๋ฌธ์ : ํผ๋ณด๋์น ์์ด์ n๋ฒ์งธ ํญ์ ๊ตฌํ๋ ํจ์๋ฅผ ์์ฑํ์ธ์.
public int Fibonacci(int n)
{
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n; i++)
{
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
์๊ฐ ๋ณต์ก๋ O(n), ๊ณต๊ฐ ๋ณต์ก๋ O(n)
๊ฐ ๋จ๊ณ์์ ๊ฐ์ฅ ์ต์ ์ธ ์ ํ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ฅ ์ด์ต์ด ํฐ ์ ํ์ ํ์ฌ, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ต์ ํด์ ๋๋ฌํ๋ ์ ๋ต.
์ง์ญ์ ์ธ ์ต์ ํด๋ฅผ ์ฐพ๋๋ฐ ์ด์ ์ ๋ง์ถ๊ธฐ ๋๋ฌธ์, ํญ์ ์ ์ญ์ ์ธ ์ต์ ํด ๋ณด์ฅ X
๊ฐ๋จํ๊ณ , ์ง๊ด์ ์ค๊ณ ๊ฐ๋ฅ. ์คํ์๊ฐ ๋งค์ฐ ๋น ๋ฆ.
์ต์ ํด๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ ์ฌ์ฉ๋์ง๋ง, ์ผ๋ถ ๋ฌธ์ ์์๋ ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์์ ์ ์์.
// ๋ฌธ์ : ์ฃผ์ด์ง ๋์ ๋ค๋ก ํน์ ๊ธ์ก์ ๋ง๋๋๋ฐ ํ์ํ ์ต์ ๋์ ์๋ฅผ ๊ตฌํ๋ ํจ์๋ฅผ ์์ฑํ์ธ์.
public int MinCoins(int[] coins, int amount)
{
Array.Sort(coins);
int count = 0;
for(int i = coins.Length - 1; i >= 0; i--)
{
while(amount >= coins[i])
{
amount -= coins[i];
count++;
}
}
if(amount > 0) return -1;
return count;
}
์๊ฐ ๋ณต์ก๋ : O(n) (๋์ ์ ๋น๋ก), ๊ณต๊ฐ ๋ณต์ก๋ : O(1)
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋ถํ , ๋ฌธ์ ์ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ํฅ์ ๊ฐ๋ฅ
์ฌ๊ท์ ๊ตฌ์กฐ, ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๊ณ๊ฐ ๋จ์, ์ง๊ด์
๋ถํ ๋ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ํด๊ฒฐ, ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ ๋ฆฌ
๋ถ๋ถ ๋ฌธ์ ๋ค ๊ฐ ์ค๋ณต ๊ณ์ฐ ๋ฐ์ ๊ฐ๋ฅ. -> Memoization๊ธฐ๋ฒ ํ์ฉ -> ์ฑ๋ฅ ํฅ์
// ๋ฌธ์ : ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ๋ ฌํ๋ ํจ์๋ฅผ ์์ฑํ์ธ์. (ํต ์ ๋ ฌ ์ฌ์ฉ)
public void QuickSort(int[] arr, int low, int high)
{
if(low < high)
{
int pi = Partition(arr, low, high);
QuickSort(arr, low, pi - 1); // Before pi
QuickSort(arr, pi + 1, high); // After pi
}
}
int Partition(int[] arr, int low, int high)
{
int pivot = arr[high];
int i = (low - 1);
for(int j = low; j <= high - 1; j++)
{
if(arr[j] < pivot)
{
i++;
Swap(arr, i, j);
}
}
Swap(arr, i + 1, high);
return (i + 1);
}
void Swap(int[] arr, int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
์๊ฐ ๋ณต์ก๋ : O(n log n) / ์ต์ = O(n^2), ๊ณต๊ฐ ๋ณต์ก๋ : O(log n) (์ฌ๊ท ํธ์ถ ์คํ ํฌ๊ธฐ)
๋ ๋ค ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ์ด ์ฌ์ฉ.
๋์ ํ๋ก๊ทธ๋๋ฐ์ Memoization์ ์ด์ฉํด ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ํด๋น ๋ฌธ์ ์ ๊ฐ์ ์ ์ฅํด๋๋๋ค. ์ดํ ํฐ ๋ฌธ์ ๊ฐ ์์ ๋ฌธ์ ์ ์ ์ฅ๋ ๊ฐ์ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๋ถํ ์ ๋ณต์ ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋ ์ด์ ํด๊ฒฐํ ์ ์์ ๋งํผ ์ชผ๊ฐ์ด ๋ฌธ์ ์ ํด๋ฅผ ๋ชจ๋ ๊ตฌํ ๋ค ๋ณํฉํ์ฌ ํฐ ๋ฌธ์ ์ ๋ต์ ์ฐพ๋๋ค.
์ค๋์ ์๊ณ ๋ฆฌ์ฆ์ ๊ดํด ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๋ฐฐ์ ๋ค.
์ ์ฒ๊ธฐ๋ฅผ ์ค๋นํ๋ฉด์ ์ฃผ์๋ค์ ์ฉ์ด๋ ์์ด์ ์ฉ์ด ์์ฒด๊ฐ ์ด๋ ต์ง๋ ์์๋ค.
๊ทธ๋ฌ๋ ๋ด ๋จธ๋ฆฟ์์ ํํ์ ์ฝ๋๋ก ํํํ๋๊ฒ ์ด๋ ค์ ๊ณ ,
์๊ณ ๋ฆฌ์ฆ ์๋๋ฅผ ํ์ ํ๋๋ฐ ์๊ฐ์ด ๋ง์ด ์์๋๋ค.
๊นจ๋ฌ์ ์ ์,
๋ด๊ฐ ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ๋ถ์ ํ์ง๋ง๊ณ ์ธ์ ํ๊ณ , ๋น ๋ฅด๊ฒ ํ์ตํ์.
๋๋ ์์ง ์ด๋ณด์๋ค. ๊ณ ์๊ฐ ๋๊ธฐ์ํด ๋ค์ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํด์ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์.
๋ํ ์ผ์ธ์ฒ ํํฐ๋์ด ๋ง์ํ์ ๊ฒ ์ฒ๋ผ
์๊ณ ๋ฆฌ์ฆ์ ๋์ํํ์!
๋ด๊ฐ ์๊ฐํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ์ด ๋์ง ์์ ๊ฒฝ์ฐ
๋จธ๋ฆฟ์์ผ๋ก ์๊ฐํ๋ฉด ์ต๊ณ ์ง๋ง ์์ง ๋ ๋ฒจ์ด ๋ฎ์ผ๋
๋์ํ๋ฅผ ํตํด ํ๋ฆ์ ์ดํดํ๊ณ , ์์ ํ์.
๋๋ ์ฒ์ฌ๊ฐ ์๋!
์๊ณ ๋ฆฌ์ฆ ๊ตฌ์ํ๊ธฐ.