[Coding_Test] Basic_Coding_Rule
1. ์๊ณ ๋ฆฌ์ฆ algorithm
๐ ์๊ณ ๋ฆฌ์ฆ์ด๋
- ์ด๋ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํด์ง ์ผ๋ จ์ ์ ์ฐจ๋ ๋ฐฉ๋ฒ; ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ง๋ง ์๋๊ฒ ์๋๋ผ ๋ฌด์ํ ๋ง์ ์ ์๋ค.
- ์์ฃผ ์ฐ์ด๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ(์๊ณ ๋ฆฌ์ฆ)์ ํจํดํ; BFS, DFS, DP, ๋ค์ต์คํธ๋ผ ๋ฑ๋ฑ
- ๊ฐ ์ํฉ์ ์ ํฉํ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์์ด์ผ ํ๋ค.
2. ์๊ณ ๋ฆฌ์ฆ ํ๊ฐ๊ธฐ์ค
๐ ์ข์ ์๊ณ ๋ฆฌ์ฆ์ด๋
- ์๊ฐ ๋ณต์ก๋
- ๊ณต๊ฐ ๋ณต์ก๋
- ๊ตฌํ ๋ณต์ก๋
-
์๊ฐ ๋ณต์ก๋
๋์ผํ ์ฝ๋๋ก ์์ฑ๋์ด๋ ์คํ ํ๊ฒฝ์ ๋ฐ๋ผ์ ๋งค๋ฒ ์คํ์๊ฐ์ด ๋ฌ๋ผ์ง ์ ์๋ค. ํ์ง๋ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ฒฝํฅ์ฑ์ ๊ณ์ฐํ ์ ์์ต๋๋ค. ์์ผ๋ก ๋ฐฐ์๋ณผ ์๊ฐ๋ณต์ก๋(Big-O)๋ฅผ ํตํด์ ์๊ณ ๋ฆฌ์ฆ๋ง๋ค ์คํ์๊ฐ ๊ฒฝํฅ์ฑ์ ์ดํด๋ณด์
-
๊ณต๊ฐ ๋ณต์ก๋ (๋ฉ๋ชจ๋ฆฌ)
๋ฉ๋ชจ๋ฆฌ๋ ํ์ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ต๋ํ ์ ์ ์ฉ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ํ์ง๋ง ์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ์ปค์ง์ ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ํตํด ํน์ ์๊ณ ๋ฆฌ์ฆ์ด ์ผ๋ง๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฒ ๋ ์ง๋ฅผ ๋ํ๋ธ๋ค.
-
๊ตฌํ ๋ณต์ก๋
๊ฝค ๊ด์ฐฎ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ ์ฌ๋ ธ๋๋ผ๋ ๊ตฌํ์ด ๋๋ฌด ๋ณต์กํ๊ณ ์์๋ณด๊ธฐ ํ๋ค๋ค๋ฉด ๋ค์ ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค. ๊ฐ๋ฐ์๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ ์ ํด์ผํ๊ณ , ๊ตฌํ์ด ๋๋ฌด ๋ณต์กํด์ง๋ฉด ๋ค๋ฅธ์ฌ๋์ ๋ฌผ๋ก ๋ฏธ๋์ ๋๋ ์์๋ณผ ์ ์๊ฒ ๋๋ค.
์๊ฐ๊ณผ ๊ณต๊ฐ์ ๋ณดํต trade-off ๊ด๊ณ! ์คํ์๊ฐ์ ์ค์ด๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํด์ผ ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ ค๋ฉด ์คํ์๊ฐ์ด ๋์ด๋๊ฒ ๋๋ค.
3. ์๊ฐ๋ณต์ก๋ Time Complexity
Runtime (์คํ ์๊ฐ)
์๊ฐ๋ณต์ก๋์ ๋ํด์ ๊ณต๋ถํ๊ธฐ ์ ์, ์คํ์๊ฐ(runtime)์ ๋ํด ์๊ณ ์์ด์ผ ํ๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋๋ฅผ ํ ์ค ํ ์ค ์์ฑํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ผํ๋ค. ๊ทธ๋ ๊ฒ ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ฉด ์ปดํจํฐ(CPU)๋ ํ ์ค ํ ์ค ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๋ชจ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ ์ป์ ์ ์๊ฒ ๋๊ณ ํ๋ก๊ทธ๋จ์ ๋๋๊ฒ ๋๋ค. ์ด๋ ๊ฒ ํ๋ก๊ทธ๋จ์ด ์์๋๊ณ ๋ชจ๋ ์ฝ๋๋ฅผ ์คํํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ runtime(์คํ์๊ฐ)์ด๋ผ๊ณ ํ๋ค.
์คํ์๊ฐ์ ์ํฅ์ ์ฃผ๋ ์์๋ ํฌ๊ฒ ๋ ๊ฐ์ง
- ํ ์ค์ ์ฝ๋๋น ๊ฑธ๋ฆฌ๋ ์๊ฐ
- ํ๋ก๊ทธ๋จ ๋ด ์คํ๋๋ ์ฝ๋์ ๊ฐฏ์
๐ก $runtime(n) = C1 + C2 + n \times C3 = An + B$ ์ ๋ ฅ๋ $n$์ ๊ฐ์ ๋ฐ๋ผ ์คํ์๊ฐ์ด ๋ณํ๋ค!
Big-O
๐ก input $n$ ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์์ ์ฐจ์์ ํญ๋ค์ด runtime์ ๋ฏธ์น๋ ์ํฅ์ด ๋ฏธ๋ฏธํ๋ค โ ์์์ฐจ์ ๋ฌด์, ๊ณ์ ๋ฌด์
Big-O๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ์ต๊ณ ์ฐจํญ์ด ๋ฌด์์ธ์ง ํ๋ณ์ ํด์ผ๋๋๋ฐ, ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ ์ธ์ฐ๊ณ ๊ณ์๋ฉด ํธํ๋ค
$n! > 2^n > n^3 > n^2 > nlogn > n > logn > 1$
simple statements
O(1)
a = 5
a += 1
single loop
O(n)
for i in range(n):
print("hi")
nested loop
O(n^2)
for i in range(n):
for j in range(n):
print("hi")
๋ ๋ฒ ์ฌํธ์ถํ๋ ์ฌ๊ทํจ์ ([recursion])
O(2^n)
int fibo(int n)
{
if (n == 1)
return 0;
else if(n == 2)
return 1;
else
return fibo(n - 1) + fibo(n-2);
}
ํ์ํด์ผ๋๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ ์ค์ด๋๋ ํจ์
ex) ์ด์งํ์ ์๊ณ ๋ฆฌ์ฆ
O(logn)
int binarySearch(int data[], int n, int target)
{
int start = 0;
int end = n;
int mid;
while (end >= start)
{
mid = (end + start) / 2;
if (data[mid] == target)
return 1;
else if (data[mid] > target)
end = mid - 1;
else
start = mid + 1;
}
return 0;
}
worst-case
Big-O notation์ ์ด์ฉํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ตฌํ ๋์๋ ์ต์ ์ ์ํฉ(worst-case)๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
# O(n)
if condition:
for i in range(n):
pass
# O(n^2)
else :
for i in range(n):
for j in range(n):
pass
์์ ์ฝ๋์์ ๋ณดํต์ ๊ฒฝ์ฐ if๋ฌธ์ด ์คํ๋๊ณ , ๊ต์ฅํ ๊ฐ๋ else๋ฌธ์ด ์คํ๋๋ค๊ณ ๊ฐ์ ๊ทธ๋ ๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ(else๋ฌธ์ด ์คํ๋๋ ์ํฉ)์ ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด๊ธฐ ๋๋ฌธ์ ์์ ์ฝ๋์ ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด๋ค.
์ฝ๋ฉํ ์คํธ๋ฅผ ์ํ ์๊ฐ๋ณต์ก๋
์ธ์ฐ๋ฉด ํธํ ๊ฒ๋ค
-
sort()
O(nlogn)$๋ช๋ช ๋ฌธ์ ๋ ์ ๋ ฌ์ ํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ ๋ ฌ์ ์ง์ ๊ตฌํํ์ง ์์ ๊ฒ์ด๊ณ , ๊ฐ ์ธ์ด์์ ์ ์๋์ด ์๋ O(nlogn) ์
sort()
ํจ์๋ฅผ ์ฌ์ฉํ์. -
Hashtable ๊ตฌ์ถ : O(n) // Hashtable ๊ฒ์ : O(1)
Hashtable์ ๊ฐ๋ ฅํจ์ ๊ฒ์์ ์๊ฐ๋ณต์ก๋๊ฐ O(1) ๋ผ๋ ์ , ์ฌ์ค hashtable์ ๊ณต๊ฐ(๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์๊ฐ์ ์ ์ฝํ๋ ๋ฐฉ๋ฒ์ค์ ํ๋๋ค
๋ณดํต ๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ํฌ๊ธฐ $n$์ ๋ฐ์ดํฐ(๋ฐฐ์ด์ ํํ)์ ํ๋ ํ๋ ์ ๊ทผํ์ฌ hashtable์ ๊ตฌ์ถํด์ผ ํ๋ค. ์ด ๊ณผ์ ์์ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค.
-
Binary Search โ O(logn)
์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ์ซ์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ธ Binary search๋ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ์์๋ ์ข ์ข ๋์จ๋ค. ๋ฐ๋ณต๋ฌธ ๋๋ ์ฌ๊ท ํจ์๊ฐ ์ฌํธ์ถ ๋ ๋๋ง๋ค ํ์ํด์ผํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ฉ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ O(logn)์ด ๋๋ค.
๋ง์ฝ ์ ๋ ฌ์ด ์๋ ๋ฐฐ์ด์ด ์ฃผ์ด์ก๋ค๋ฉด, ์ ๋ ฌ $O(nlogn)$์ ๋จผ์ ํด์ฃผ์ด์ผ ํ๋ค.
-
Heap (priority queue)
- ๊ธธ์ด๊ฐ n์ธ ๋ฐฐ์ด์ heap์ผ๋ก ๋ง๋ค ๋ โ O(nlogn)
- push() โ O(logn)
- pop() โ O(logn)
์ฐธ์กฐ : ๊ฐ๋ฐ๋จ๋ ธ์จ ์๋ฃ๊ตฌ์กฐ
Leave a comment