๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Computer Science

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ• - ์ด์ง„ ํƒ์ƒ‰, ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

by Leica 2020. 3. 23.
๋ฐ˜์‘ํ˜•

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ• - ์ด์ง„ ํƒ์ƒ‰, ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ๋ถ„ํ• ์ •๋ณต(Divide-and-Conquer) ๋ฐฉ๋ฒ•

- ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜

- ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ• : ๋ถ„ํ• ์ •๋ณต(divide-and-conquer) ๋ฐฉ๋ฒ•, ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(dynamic programming) ๋ฐฉ๋ฒ•, ์š•์‹ฌ์Ÿ์ด(greedy) ๋ฐฉ๋ฒ•

 

1) ๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ•์˜ ์›๋ฆฌ

- ์ˆœํ™˜์ (recursive)์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ํ•˜ํ–ฅ์‹(top-down) ์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ์ž…๋ ฅ์„ ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ์ˆœํ™˜์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋ถ„ํ• ๋œ ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ ํ›„ ๊ทธ ํ•ด๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์›๋ž˜ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹

 

2) ๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ•์˜ ํŠน์ง•

- ๋ถ„ํ• ๋œ ์ž‘์€ ๋ฌธ์ œ๋Š” ์›๋ž˜ ๋ฌธ์ œ์™€ ์„ฑ๊ฒฉ์ด ๋™์ผํ•˜๋‹ค. → ์ž…๋ ฅ ํฌ๊ธฐ๋งŒ ์ž‘์•„์ง

- ๋ถ„ํ• ๋œ ๋ฌธ์ œ๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์ด๋‹ค. → ์ˆœํ™˜์  ๋ถ„ํ•  ๋ฐ ๊ฒฐ๊ณผ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ

 

3) ๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ•์˜ ์ฒ˜๋ฆฌ ๊ณผ์ • : ๋ถ„ํ•  → ์ •๋ณต → ๊ฒฐํ•ฉ

๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ•์˜ ๊ฐ ์ˆœํ™˜ ํ˜ธ์ถœ ์‹œ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •

 

  • ๋ถ„ํ•  : ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• 
  • ์ •๋ณต : ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ์ˆœํ™˜์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ๋ถ„ํ• ๋˜์ง€ ์•Š์„ ์ •๋„๋กœ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘๋‹ค๋ฉด ์ˆœํ™˜ํ˜ธ์ถœ ์—†์ด ์ž‘์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋ฅผ ๊ตฌํ•จ
  • ๊ฒฐํ•ฉ : ์ž‘์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •๋ณต๋œ ํ•ด๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์›๋ž˜ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ๊ตฌํ•จ

 

4) ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์ด์ง„ ํƒ์ƒ‰, ํ•ฉ๋ณ‘ ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ์„ ํƒ ๋ฌธ์ œ

๋ถ„ํ• ์ •๋ณต ๋ฐฉ๋ฒ•์ด ์ ์šฉ๋œ ์ด์ง„ ํƒ์ƒ‰, ํ•ฉ๋ณ‘ ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ์„ ํƒ ๋ฌธ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ์˜ ๋ถ„ํ•  ๊ณผ์ •

 

- n์€ ์ž…๋ ฅ ํฌ๊ธฐ = ๋ฐ์ดํ„ฐ ์ˆ˜๋ฅผ ์˜๋ฏธ

- ๊ฒ€์ •์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์€ ๋ฌธ์ œ์—์„œ ๋ฐฐ์ œ๋œ ๋ถ€๋ถ„

- ์ด์ง„ ํƒ์ƒ‰๊ณผ ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ผ์ •ํ•˜๊ฒŒ ์ ˆ๋ฐ˜์”ฉ ๋ถ„ํ• 

- ํ€ต ์ •๋ ฌ๊ณผ ์„ ํƒ ๋ฌธ์ œ๋Š” ๋ถ„ํ•  ํฌ๊ธฐ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š์Œ

 

2. ์ด์ง„ ํƒ์ƒ‰(Binary Search)

* ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํšจ๊ณผ์ ์ธ ํƒ์ƒ‰ ๋ฐฉ๋ฒ• (์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •)

* ์ž…๋ ฅ์ด ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ

* ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ ์‹œ ๋ฐ์ดํ„ฐ์˜ ์ •๋ ฌ ์ƒํƒœ ์œ ์ง€ ํ•„์š”

- ํ‰๊ท  n/2๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ด๋™ ๋ฐœ์ƒ

- ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•œ ์‘์šฉ์— ๋ถ€์ ํ•ฉ

 

* ๋ฐฐ์—ด์˜ ๊ฐ€์šด๋ฐ ์›์†Œ์™€ ํƒ์ƒ‰ํ‚ค x๋ฅผ ๋น„๊ต

1) ํƒ์ƒ‰ํ‚ค = ๊ฐ€์šด๋ฐ ์›์†Œ → ํƒ์ƒ‰ ์„ฑ๊ณต

2) ํƒ์ƒ‰ํ‚ค < ๊ฐ€์šด๋ฐ ์›์†Œ → '์ด์ง„ ํƒ์ƒ‰(ํฌ๊ธฐ ½์˜ ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด)' ์ˆœํ™˜ ํ˜ธ์ถœ

3) ํƒ์ƒ‰ํ‚ค > ๊ฐ€์šด๋ฐ ์›์†Œ → '์ด์ง„ ํƒ์ƒ‰(ํฌ๊ธฐ ½์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด)' ์ˆœํ™˜ ํ˜ธ์ถœ

 

* ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ๋Œ€์ƒ ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ½์”ฉ ๊ฐ์†Œ

* ์„ฑ๋Šฅ : Θ(logn)

 

1) ์ด์ง„ ํƒ์ƒ‰์˜ ๋ถ„ํ• ์ •๋ณต ๊ณผ์ •

  • ๋ถ„ํ•  : ๋ฐฐ์—ด์˜ ๊ฐ€์šด๋ฐ ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋ถ„ํ• . ํƒ์ƒ‰ํ‚ค์™€ ๊ฐ€์šด๋ฐ ์›์†Œ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋ฐ˜ํ™˜ ๋ฐ ์ข…๋ฃŒ
  • ์ •๋ณต : ํƒ์ƒ‰ํ‚ค๊ฐ€ ๊ฐ€์šด๋ฐ ์›์†Œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์„ ๋Œ€์ƒ์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰์„ ์ˆœํ™˜ ํ˜ธ์ถœ, ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์„ ๋Œ€์ƒ์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰์„ ์ˆœํ™˜ํ˜ธ์ถœ
  • ๊ฒฐํ•ฉ : ํƒ์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ง์ ‘ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ๊ฒฐํ•ฉ ๋ถˆํ•„์š”

 

2) ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์ˆœํ™˜ ํ˜•ํƒœ

BinarySearch(A[], Left, Right, x) {
	if (Left > Right) return -1;	// ํƒ์ƒ‰ ์‹คํŒจ
    Mid = floor((Left + Right)/2);	// ๋ฐ”๋‹ฅ ํ•จ์ˆ˜
    
    if (x == A[Mid]) return Mid;
    else {
    	if (x < Mid) BinarySearch(A, Left, Mid-1, x);	// ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด
    	else BinarySearch(A, Mid+1, Right, x);	// ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด
    }
}

 

3) ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๋ฐ˜๋ณต ํ˜•ํƒœ

BinarySearch_Iteration(A[], n, x) {
	Left = 0;
    Right = n-1;
    
    while (Left <= Right) {
    	Mid = floor((Left+Right)/2);	// ๋ฐ”๋‹ฅ ํ•จ์ˆ˜
        if (x == A[Mid]) return Mid;	// ํƒ์ƒ‰ ์„ฑ๊ณต
        else {
        	if (x < Mid) Right = Mid - 1;	// ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด
            else Left = Mid + 1;	// ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด
    }
    return -1;	// ํƒ์ƒ‰ ์‹คํŒจ
}

 

4) ์ด์ง„ ํƒ์ƒ‰์˜ ์„ฑ๋Šฅ

  • T(n) = logn

 

(1) ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ n์ผ๋•Œ ์ตœ๋Œ€ ๋ถ„ํ•  ํšŸ์ˆ˜ k

์˜ˆ) ์ž…๋ ฅ ํฌ๊ธฐ n = 8์ด๋ฉด ์ตœ๋Œ€ ๋ถ„ํ•  ํšŸ์ˆ˜ k = 3

 

(2) ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ n์ผ๋•Œ ์ตœ๋Œ€ ๋น„๊ต ํšŸ์ˆ˜

์ตœ๋Œ€ ๋ถ„ํ•  ํšŸ์ˆ˜ + 1

 

(3) ์„ฑ๋Šฅ

BinarySearch(A[], Left, Right, x) {
	// ์ค‘๋žต..
    if (x == A[Mid]) return Mid;	// ๋ฐ”๊นฅ ์ˆ˜์ค€
    else {
    	// ์ˆœํ™˜ ํ˜ธ์ถœ
    	if (x < Mid) BinarySearch(A, Left, Mid-1, x);
    	else BinarySearch(A, Mid+1, Right, x);
    }
}
T(n)
= ์ž…๋ ฅ ํฌ๊ธฐ n์— ๋Œ€ํ•œ ํƒ์ƒ‰ ๊ณผ์ •์—์„œ์˜ ๋ชจ๋“  ๋น„๊ต ํšŸ์ˆ˜์˜ ํ•ฉ
= ๋ฐ”๊นฅ ์ˆ˜์ค€์—์„œ์˜ ๋น„๊ต ํšŸ์ˆ˜ + ์ˆœํ™˜ ํ˜ธ์ถœ์—์„œ์˜ ๋น„๊ต ํšŸ์ˆ˜

 

3. ํ€ต ์ •๋ ฌ(Quicksort)

* ํŠน์ • ์›์†Œ ํ”ผ๋ฒ—(pivot)์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๊ฐ ๋ถ€๋ถ„๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต ์ •๋ ฌ์„ ์ˆœํ™˜์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹

 

๋ถ„ํ•  ํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’ < ํ”ผ๋ฒ— < ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’

 

* ์ตœ์„ /ํ‰๊ท  ์„ฑ๋Šฅ Θ(nlogn)

* ์ตœ์•… ์„ฑ๋Šฅ Θ(n²)

* ์ตœ์•…์˜ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Œ

- ํ”ผ๋ฒ— ์„ ํƒ์˜ ์ž„์˜์„ฑ์ด ๋ณด์žฅ๋˜๋ฉด ํ‰๊ท ์ ์ธ ์„ฑ๋Šฅ์„ ๋ณด์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Œ

- ๋ฐฐ์—ด์—์„œ ์ž„์˜๋กœ ๊ฐ’์„ ์„ ํƒํ•ด์„œ ๋ฐฐ์—ด์˜ ์ฒ˜์Œ ์›์†Œ์™€ ๊ตํ™˜ ํ›„ ์ •๋ ฌ ์ˆ˜ํ–‰

 

1) ํ€ต ์ •๋ ฌ์˜ ๋ถ„ํ• ์ •๋ณต ๊ณผ์ •

  • ๋ถ„ํ•  : ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋ถ„ํ• 
  • ์ •๋ณต : ๋‘ ๋ถ€๋ถ„๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต ์ •๋ ฌ์„ ์ˆœํ™˜์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๊ฐ ๋ถ€๋ถ„๋ฐฐ์—ด์„ ์ •๋ ฌ
  • ๊ฒฐํ•ฉ : ๊ฒฐํ•ฉ ๋ถˆํ•„์š”

 

2) ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

void QuickSort(A[], n) {
	if (n>1) {
    	pivot = Partition(A[0...n-1], n);	// ๋‘ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋ถ„ํ• 
        QuickSort(A[0...pivot-1], pivot);	// ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด ์ˆœํ™˜ ํ˜ธ์ถœ
        QuickSort(A[pivot+1...n-1], n-pivot-1);	//์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด ์ˆœํ™˜ ํ˜ธ์ถœ
    }
}

int Partition(A[], n) {
	Left = 1;
    Right = n-1;
    
    while (Left < Right) {	// ํ”ผ๋ฒ— A[0]
    	// ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ฐพ์Œ
        while (Left < n && A[Left] < A[0]) Left++;
        // ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ฐพ์Œ
        while (Right > 0 && A[Right] >= A[0]) Right--;
        // Left, Right ๊ตํ™˜
        if (Left < Right) exchange(A[Left], A[Right]);
        // ํ”ผ๋ฒ—, Right ๊ตํ™˜
        else exchange(A[0], A[Right]);
    }
}

 

ํ€ต ์ •๋ ฌ ๊ณผ์ • 1
ํ€ต ์ •๋ ฌ ๊ณผ์ • 2
ํ€ต ์ •๋ ฌ ๊ณผ์ • 3
ํ€ต ์ •๋ ฌ ๊ณผ์ • 4 - ์˜ค๋ฆ„์ฐจ์ˆœ ํ€ต ์ •๋ ฌ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ์šฐ์ธก์— ∞๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

3) ํ€ต ์ •๋ ฌ์˜ ์„ฑ๋Šฅ

  • ํ‰๊ท  : T(n) = O(nlogn)
  • ์ตœ์•… : T(n) = O(n²)
  • ์ตœ์„  : T(n) = O(nlogn)

 

(1) ๋ถ„ํ•  ํ•จ์ˆ˜ Partition()์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„

Θ(n)

ํ€ต ์ •๋ ฌ์˜ ๋ถ„ํ•  ํ•จ์ˆ˜๋Š” Θ(n)์˜ ์„ ํ˜• ์‹œ๊ฐ„์„ ๊ฐ–๋Š”๋‹ค.

 

(2) ํ€ต ์ •๋ ฌ QuickSort() ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ๋ถ„์„

T(n)
= ํ•œ ๋ฒˆ์˜ ๋ถ„ํ•  ํ•จ์ˆ˜ Partition() ํ˜ธ์ถœ + ๋‘ ๋ฒˆ์˜ ํ€ต ์ •๋ ฌ ํ•จ์ˆ˜ QuickSort() ํ˜ธ์ถœ
= Θ(n) + ๋‘ ๋ฒˆ์˜ ํ€ต ์ •๋ ฌ ํ•จ์ˆ˜ QuickSort() ํ˜ธ์ถœ

 

* ํ€ต ์ •๋ ฌ - ์ตœ์•…์˜ ๊ฒฝ์šฐ

- ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์›์†Œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋ถ„ํ• ๋˜๋Š” ๊ฒฝ์šฐ : ์ฆ‰ ํ”ผ๋ฒ—์ด ํ•ญ์ƒ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ตœ์†Œ๊ฐ’ ํ˜น์€ ์ตœ๋Œ€๊ฐ’์ด ๋˜๋Š” ๊ฒฝ์šฐ

- ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์ด๊ณ  ํ”ผ๋ฒ—์ด ๋ฐฐ์—ด์˜ ์ฒ˜์Œ ์›์†Œ์ธ ๊ฒฝ์šฐ

 

 

 

* ํ€ต ์ •๋ ฌ - ์ตœ์„ ์˜ ๊ฒฝ์šฐ

- ํ”ผ๋ฒ—์„ ์ค‘์‹ฌ์œผ๋กœ ํ•ญ์ƒ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ๋‘ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋ถ„ํ• ๋˜๋Š” ๊ฒฝ์šฐ

- ํ”ผ๋ฒ—์ด ํ•ญ์ƒ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’์ด ๋˜๋Š” ๊ฒฝ์šฐ

 

 

References

ํ•œ๊ตญ๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณผํ•™๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜(์ด๊ด€์šฉ)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€