CS/μ•Œκ³ λ¦¬μ¦˜

[μ•Œκ³ λ¦¬μ¦˜] μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

벼리01 2024. 3. 11. 22:39

πŸ“Œμ•Œκ³ λ¦¬μ¦˜

컴퓨터 κ³Όν•™μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ΄λž€ 문제λ₯Ό ν‘ΈλŠ” μ ˆμ°¨μ™€ 과정을 μΌμ»«λŠ”λ‹€. μ£Όμ–΄μ§„ 문제λ₯Ό ν•΄κ²°ν•˜κ±°λ‚˜ ν•¨μˆ˜λ₯Ό κ³„μ‚°ν•˜κΈ° μœ„ν•΄ 따라야 ν•  λͺ…령어듀을 λ‹¨κ³„μ μœΌλ‘œ λ‚˜μ—΄ν•œ 것을 λœ»ν•œλ‹€.

 

πŸ“Œμ‘°κ±΄

1. μž…μΆœλ ₯: 0개 μ΄μƒμ˜ μ™ΈλΆ€ μž…λ ₯κ³Ό 1개 μ΄μƒμ˜ 좜λ ₯을 μƒμ„±ν•œλ‹€.

2. λͺ…ν™•μ„±: 각 λͺ…령은 λͺ¨ν˜Έν•˜μ§€ μ•Šκ³  λͺ…ν™•ν•΄μ•Όν•œλ‹€.

3. μœ ν•œμ„±: ν•œμ •λœ 수의 단계λ₯Ό 거친 ν›„μ—λŠ” λ°˜λ“œμ‹œ μ’…λ£Œν•΄μ•Όν•œλ‹€.

4. μœ νš¨μ„±: λͺ¨λ“  λͺ…령은 μ»΄ν“¨ν„°μ—μ„œ μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

5. νš¨μœ¨μ„±: μ•Œκ³ λ¦¬μ¦˜μ€ νš¨μœ¨μ μ΄μ–΄μ•Ό ν•œλ‹€.(μ‹€μš©μ  관점)

 

μ£Όμ–΄μ§„ λ¬Έμ œμ— λŒ€ν•œ ν•˜λ‚˜ μ΄μƒμ˜ κ²°κ³Όλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ λͺ¨ν˜Έν•˜μ§€ μ•Šκ³  λ‹¨μˆœ λͺ…ν™•ν•˜λ©° 컴퓨터가 μˆ˜ν–‰ν•  수 μžˆλŠ” μœ ν•œ 개의 일련의 λͺ…령어듀을 μˆœμ„œμ— 따라 κ΅¬μ„±ν•œ 것을 μ•Œκ³ λ¦¬μ¦˜μ΄λΌ ν•œλ‹€.

 

 

πŸ“Œ섀계

μ£Όμ–΄μ§„ λ¬Έμ œμ™€ 쑰건은 맀우 λ‹€μ–‘ν•˜κΈ° λ•Œλ¬Έμ— 일반적/λ²”μš©μ μΈ 섀계 기법은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ•Œκ³ λ¦¬μ¦˜ 생성 κ³Όμ •: 섀계, ν‘œν˜„(기술), μ •ν™•μ„± 뢄석, νš¨μœ¨μ„± 뢄석

 

μš•μ‹¬μŸμ΄(greedy, νƒμš•μ ) 방법

μ „ν›„ λ‹¨κ³„μ˜ 선택과 상관 없이 각 λ‹¨κ³„λ§ˆλ‹€ κ°€μž₯ μ΅œμ„ μ΄λΌκ³  μ—¬κ²¨μ§€λŠ” ꡭ뢀적인 μ΅œμ ν•΄λ₯Ό μ„ νƒν•΄λ‚˜κ°€λ©΄ 결과적으둜 전체적인 μ΅œμ ν•΄λ₯Ό ꡬ할 수 μžˆμ„ κ²ƒμ΄λΌλŠ” 희망적인(μ΅œμ ν•΄λ₯Ό 보μž₯ν•˜μ§€ λͺ»ν•¨) μ „λž΅μ„ μ·¨ν•˜λŠ” 방법.

단점: ꡭ뢀적인 μ΅œμ ν•΄κ°€ 전체적인 μ΅œμ ν•΄κ°€ 아닐 κ°€λŠ₯성이 λ†’μŒ.

ex) κ±°μŠ€λ¦„λˆ 문제(단, λ™μ „μ˜ μ•‘λ©΄κ°€κ°€ 일반적인 경우 μ΅œμ ν•΄λ₯Ό ꡬ할 수 μ—†μŒ), λ°°λ‚­ 문제(단, 물체λ₯Ό μͺΌκ°€ 수 μ—†λŠ” 경우 μ΅œμ ν•΄λ₯Ό ꡬ할 수 μ—†μŒ)

 

λΆ„ν•  정볡(Divide and Conquer) 방법

ν•˜ν–₯식 μ ‘κ·Ό 방법. μ£Όμ–΄μ§„ 문제의 μž…λ ₯을 더이상 λ‚˜λˆŒ 수 없을 λ•ŒκΉŒμ§€ μˆœν™˜μ μœΌλ‘œ 2개 μ΄μƒμ˜ μž‘μ€ λ¬Έμ œλ“€λ‘œ λ‚˜λˆ„κ³ , μ΄λ ‡κ²Œ λΆ„ν• λœ μž‘μ€ λ¬Έμ œλ“€μ„ 각각 ν•΄κ²°ν•œ ν›„ ν•΄λ‘œ κ²°ν•©ν•˜μ—¬ μ›λž˜ 문제의 ν•΄λ₯Ό κ΅¬ν•˜λŠ” 방식.

ex)  퀡 μ •λ ¬, 합병 μ •λ ¬, 이진 탐색

 

동적 ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 방법

μž…λ ₯의 크기가 κ°€μž₯ μž‘μ€ λΆ€λΆ„ λ¬Έμ œλΆ€ν„° ν•΄λ₯Ό κ΅¬ν•˜μ—¬ ν…Œμ΄λΈ”μ— μ €μž₯ν•˜κ³ , 이λ₯Ό μ΄μš©ν•˜μ—¬ μž…λ ₯ 크기가 보닀 큰 문제의 ν•΄λ₯Ό μ μ§„μ μœΌλ‘œ λ§Œλ“€μ–΄κ°€λŠ” 상ν–₯식 μ ‘κ·Ό 방법.

ex) ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜(λͺ¨λ“  쌍 κ°„μ˜ μ΅œλ‹¨ 경둜) 문제, 연쇄적 ν–‰λ ¬ κ³±μ…ˆ 문제, 졜μž₯ 곡톡 λΆ€λΆ„ μˆ˜μ—΄ 문제

 

 

 

πŸ“Œ뢄석

μ •ν™•μ„± 뢄석

μœ νš¨ν•œ μž…λ ₯에 λŒ€ν•΄ μœ ν•œ μ‹œκ°„ 내에 μ •ν™•ν•œ κ²°κ³Όλ₯Ό μƒμ„±ν•΄λ‚΄λŠ” 지에 λŒ€ν•œ μ—¬λΆ€.

 

νš¨μœ¨μ„± 뢄석

μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰μ— ν•„μš”ν•œ μžμ›μ˜ 양을 평가.

- 곡간 λ³΅μž‘λ„(λ©”λͺ¨λ¦¬μ˜ μ–‘)

- μ‹œκ°„ λ³΅μž‘λ„(μ‹€ν–‰μ—μ„œλΆ€ν„° μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„)

 

μ‹œκ°„ λ³΅μž‘λ„

μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„. μž…λ ₯ 크기 n에 따라 μ‹€ν–‰λ˜λŠ” μ‘°μž‘μ˜ 수. μ•Œκ³ λ¦¬μ¦˜μ˜ 각 λ¬Έμž₯이 μˆ˜ν–‰λ˜λŠ” 횟수의 ν•©. -> μž…λ ₯ 크기의 ν•¨μˆ˜λ‘œ ν‘œν˜„.

일반적으둜 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” μ΅œμ•…μ˜ μˆ˜ν–‰ μ‹œκ°„μ„ μ‚¬μš©ν•¨.

μ΅œμ•…μ˜ μˆ˜ν–‰ μ‹œκ°„μœΌλ‘œ λ”°μ‘Œμ„ λ•Œ μƒλŒ€μ μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜ μ„±λŠ₯의 μš°μ—΄μ„ 가리기 쉬움.(ex 좜근 μ‹œκ°„ μ˜ˆμƒ)

 

점근 μ„±λŠ₯

μž…λ ₯ 크기 n이 λ¬΄ν•œνžˆ 컀짐(μ¦κ°€ν•˜λŠ” μΆ”μ„Έ)에 따라 κ²°μ •λ˜λŠ” μ„±λŠ₯. 

- μž…λ ₯ 크기가 μΆ©λΆ„νžˆ 컀짐에 따라 ν•¨μˆ«κ°’μ— κ°€μž₯ 큰 영ν–₯을 λ―ΈμΉ˜λŠ” 차수(ν•­)을 찾음.

- μˆ˜ν–‰ μ‹œκ°„μ˜ 닀항식 ν•¨μˆ˜μ—μ„œ μ΅œκ³ μ°¨ν•­λ§Œμ„ κ³„μˆ˜ 없이 μ·¨ν•΄μ„œ ν‘œν˜„.

- μˆ˜ν–‰ μ‹œκ°„μ˜ μ •ν™•ν•œ 값이 μ•„λ‹Œ μ–΄λ¦Όκ°’μž„. -> μˆ˜ν–‰ μ‹œκ°„μ˜ 증가 μΆ”μ„Έ νŒŒμ•… κ°€λŠ₯. μ•Œκ³ λ¦¬μ¦˜ κ°„μ˜ μš°μ—΄μ„ λ”°μ§ˆ 수 있음.


Big O ν‘œκΈ°λ²•

O(1)  <  O(logn)  <  O(n)  <  O(nlogn)  <  O(n^2)  <  O(n^3)  <  O(2^n)

μž…λ ₯ 크기가 컀지더라도 μˆ˜ν–‰ μ‹œκ°„μ΄ 천천히 μ¦κ°€ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ„±λŠ₯이 쒋은 μ•Œκ³ λ¦¬μ¦˜μž„.

 

μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„ κ΅¬ν•˜κΈ°

κΈ°λ³Έ μ—°μ‚° μˆ˜ν–‰ 횟수의 ν•© f(n)을 κ΅¬ν•œ ν›„, f(n)=O(g(n))을 λ§Œμ‘±ν•˜λŠ” μ΅œμ†Œ 차수 ν•¨μˆ˜ g(n)을 μ°ΎλŠ”λ‹€.

-> μ•Œκ³ λ¦¬μ¦˜μ˜ λͺ¨λ“  λ¬Έμž₯이 μ•„λ‹Œ λ£¨ν”„μ˜ 반볡 νšŸμˆ˜λ§Œμ„ μ‘°μ‚¬ν•˜μ—¬ 졜고 차수λ₯Ό μ‹œκ°„ λ³΅μž‘λ„λ‘œ ν‘œκΈ°ν•˜λ©΄ μ•Œκ³ λ¦¬μ¦˜ μ„±λŠ₯의 μš°μœ„λ₯Ό 가릴 수 있음.

 

i = 1;			// 1
while(i <= n) {		// n + 1
	x = x + 1;		// n
    i = i + 1;		// n
}

 

μœ„ μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•˜μ—¬ `f(n) = 3n+2` μ΄λ―€λ‘œ, 졜고 차항을 뽑아 κ³„μˆ˜ 없이 `O(n)`으둜 ν‘œκΈ°ν•  수 있음. -> λ£¨ν”„μ˜ 반볡 νšŸμˆ˜μ™€ 동일.

 

 

πŸ“Œμˆœν™˜(μž¬κ·€ recursion) μ•Œκ³ λ¦¬μ¦˜

μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ κ³Όμ •μ—μ„œ 자기 μžμ‹ μ˜ μ•Œκ³ λ¦¬μ¦˜μ„ λ‹€μ‹œ μˆ˜ν–‰ν•˜λŠ” μƒνƒœ.

μˆœν™˜ μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ€ 점화식 ν˜•νƒœλ‘œ ν‘œν˜„λ˜λ©°, 이λ₯Ό ν’€μ–΄μ„œ νμ‡„ν˜•μ„ ꡬ할 수 있음.

- 퀡 μ •λ ¬(μ΅œμ•…) T(n) = T(n-1) + O(n), T(1) = O(1)  -> T(n) = O(n^2)

- 이진 탐색 T(n) = T(n/2) + O(1), T(1) = O(1)  -> T(n) = O(logn)

- 퀡 μ •λ ¬(μ΅œμ„ ), 합병 μ •λ ¬ T(n) = 2T(n/2) + O(n), T(1) = O(1)  -> T(n) = O(nlogn)