[Coding_Test] Basic_Coding_Rule

1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ algorithm

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€

  • ์–ด๋– ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ•ด์ง„ ์ผ๋ จ์˜ ์ ˆ์ฐจ๋‚˜ ๋ฐฉ๋ฒ•; ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐ€์ง€๋งŒ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฌด์ˆ˜ํžˆ ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(์•Œ๊ณ ๋ฆฌ์ฆ˜)์€ ํŒจํ„ดํ™”; BFS, DFS, DP, ๋‹ค์ต์ŠคํŠธ๋ผ ๋“ฑ๋“ฑ
  • ๊ฐ ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

2. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‰๊ฐ€๊ธฐ์ค€

๐Ÿ“ ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€

  • ์‹œ๊ฐ„ ๋ณต์žก๋„
  • ๊ณต๊ฐ„ ๋ณต์žก๋„
  • ๊ตฌํ˜„ ๋ณต์žก๋„
  1. ์‹œ๊ฐ„ ๋ณต์žก๋„

    ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋˜์–ด๋„ ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ๋งค๋ฒˆ ์‹คํ–‰์‹œ๊ฐ„์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ๊ฒฝํ–ฅ์„ฑ์€ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฐฐ์›Œ๋ณผ ์‹œ๊ฐ„๋ณต์žก๋„(Big-O)๋ฅผ ํ†ตํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งˆ๋‹ค ์‹คํ–‰์‹œ๊ฐ„ ๊ฒฝํ–ฅ์„ฑ์„ ์‚ดํŽด๋ณด์ž

  2. ๊ณต๊ฐ„ ๋ณต์žก๋„ (๋ฉ”๋ชจ๋ฆฌ)

    ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•œ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ์ ์€ ์šฉ๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์ด ์ปค์ง์— ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ํ†ตํ•ด ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ผ๋งˆ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋  ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  3. ๊ตฌํ˜„ ๋ณต์žก๋„

    ๊ฝค ๊ดœ์ฐฎ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋– ์˜ฌ๋ ธ๋”๋ผ๋„ ๊ตฌํ˜„์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค๋‹ค๋ฉด ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ˜‘์—…์„ ํ•ด์•ผํ•˜๊ณ , ๊ตฌํ˜„์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋ฉด ๋‹ค๋ฅธ์‚ฌ๋žŒ์€ ๋ฌผ๋ก  ๋ฏธ๋ž˜์˜ ๋‚˜๋„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์€ ๋ณดํ†ต trade-off ๊ด€๊ณ„! ์‹คํ–‰์‹œ๊ฐ„์„ ์ค„์ด๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋ ค๋ฉด ์‹คํ–‰์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

3. ์‹œ๊ฐ„๋ณต์žก๋„ Time Complexity

Runtime (์‹คํ–‰ ์‹œ๊ฐ„)

์‹œ๊ฐ„๋ณต์žก๋„์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์—, ์‹คํ–‰์‹œ๊ฐ„(runtime)์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„ ํ•œ ์ค„ ์ž‘์„ฑํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์™„์„ฑํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์™„์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ปดํ“จํ„ฐ(CPU)๋Š” ํ•œ ์ค„ ํ•œ ์ค„ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์€ ๋๋‚˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๊ณ  ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ runtime(์‹คํ–‰์‹œ๊ฐ„)์ด๋ผ๊ณ  ํ•œ๋‹ค.

์‹คํ–‰์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์š”์†Œ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€

  1. ํ•œ ์ค„์˜ ์ฝ”๋“œ๋‹น ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„
  2. ํ”„๋กœ๊ทธ๋žจ ๋‚ด ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์˜ ๊ฐฏ์ˆ˜

๐Ÿ’ก $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)์ด๋‹ค.

์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„

์™ธ์šฐ๋ฉด ํŽธํ•œ ๊ฒƒ๋“ค

  1. sort() O(nlogn)$

    ๋ช‡๋ช‡ ๋ฌธ์ œ๋Š” ์ •๋ ฌ์„ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ •๋ ฌ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ , ๊ฐ ์–ธ์–ด์—์„œ ์ •์˜๋˜์–ด ์žˆ๋Š” O(nlogn) ์˜ sort() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž.

  2. Hashtable ๊ตฌ์ถ• : O(n) // Hashtable ๊ฒ€์ƒ‰ : O(1)

    Hashtable์˜ ๊ฐ•๋ ฅํ•จ์€ ๊ฒ€์ƒ‰์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1) ๋ผ๋Š” ์ , ์‚ฌ์‹ค hashtable์€ ๊ณต๊ฐ„(๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘์— ํ•˜๋‚˜๋‹ค

    ๋ณดํ†ต ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง€๋Š” ํฌ๊ธฐ $n$์˜ ๋ฐ์ดํ„ฐ(๋ฐฐ์—ด์˜ ํ˜•ํƒœ)์— ํ•˜๋‚˜ ํ•˜๋‚˜ ์ ‘๊ทผํ•˜์—ฌ hashtable์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

  3. Binary Search โ‡’ O(logn)

    ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ Binary search๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ์—์„œ๋„ ์ข…์ข… ๋‚˜์˜จ๋‹ค. ๋ฐ˜๋ณต๋ฌธ ๋˜๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ์žฌํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ํƒ์ƒ‰ํ•ด์•ผํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ ˆ๋ฐ˜์”ฉ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(logn)์ด ๋œ๋‹ค.

    ๋งŒ์•ฝ ์ •๋ ฌ์ด ์•ˆ๋œ ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ๋‹ค๋ฉด, ์ •๋ ฌ $O(nlogn)$์„ ๋จผ์ € ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  4. Heap (priority queue)

    • ๊ธธ์ด๊ฐ€ n์ธ ๋ฐฐ์—ด์„ heap์œผ๋กœ ๋งŒ๋“ค ๋•Œ โ‡’ O(nlogn)
    • push() โ‡’ O(logn)
    • pop() โ‡’ O(logn)

์ฐธ์กฐ : ๊ฐœ๋ฐœ๋‚จ๋…ธ์”จ ์ž๋ฃŒ๊ตฌ์กฐ

Leave a comment