λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“š 전곡 곡뢀/λ¬Έμ œν•΄κ²°κΈ°λ²•

[λ¬Έμ œν•΄κ²°κΈ°λ²•] 5. μš•μ‹¬μŸμ΄ 기법

1. μš•μ‹¬μŸμ΄ μ•Œκ³ λ¦¬μ¦˜ : Greedy algorithm

맀 λ‹¨κ³„λ§ˆλ‹€ 각 λ‹¨κ³„μ—μ„œ μ΅œμ„ μ˜ 선택을 ν•œλ‹€. (ν˜„μž¬ μˆœκ°„λ§ˆλ‹€)

μ•Œκ³ λ¦¬μ¦˜μ΄ 맀우 κ°„λ‹¨ν•˜λ‚˜, κ΅¬ν•œ 닡이 정닡인지 검증이 ν•„μš”ν•˜λ‹€.

 

κΈ°λ³Έ ν˜•νƒœ

2. νšŒμ˜μ‹€ λ°°μ • 문제

ν•œ 개의 νšŒμ˜μ‹€μ΄ μžˆλŠ”λ°, n개의 회의 일정이 있고 이 νšŒμ˜μ‹€μ„ μ΄μš©ν•˜μ—¬ νšŒμ˜ν•œλ‹€. 각 회의 i에 λŒ€ν•΄μ„œ μ‹œμž‘ μ‹œκ°„ Si와 끝 μ‹œκ°„ Fiκ°€ 주어진닀. 각 νšŒμ˜κ°€ κ²ΉμΉ˜μ§€ μ•Šκ²Œ ν•˜λ©΄μ„œ κ°€μž₯ λ§Žμ€ 횟수의 회의λ₯Ό ν•  수 μžˆλ„λ‘ 일정을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
❖ μž…λ ₯ ➒ 첫 μ€„μ—λŠ” 회의의 수 n
            ➒ λ‘˜μ§Έ 쀄뢀터 n+1μ€„κΉŒμ§€ 두 μ •μˆ˜ Si와 Fi
❖ 좜λ ₯ ➒ μž‘μ€ 회의λ₯Ό μ°¨λ‘€λŒ€λ‘œ 좜λ ₯(λ‘˜ μ΄μƒμ˜ 닡이 μžˆμ„ 수 있음)

 

κ°€λŠ₯ν•œ μ ‘κ·Ό 방법

- νšŒμ˜μ‹œκ°„μ΄ 짧은 것 λΆ€ν„° λ„£λŠ”λ‹€ -> λ°˜λ‘€ 쑴재

- λ‹€λ₯Έ νšŒμ˜μ™€ κ°€μž₯ 적게 κ²ΉμΉ˜λŠ” νšŒμ˜λΆ€ν„° λ„£λŠ”λ‹€ -> λ°˜λ‘€ 쑴재

- κ°€μž₯ 빨리 λλ‚˜λŠ” νšŒμ˜λΆ€ν„° λ„£λŠ”λ‹€!!

 

증λͺ…

νšŒμ˜λ“€μ„ λλ‚˜λŠ” μ‹œκ°„μ— 따라 μ •λ ¬ν•˜μ—¬ 회의 번호λ₯Ό {1 , ... , n} 이라고 ν•˜μž. 그러면 정닡은 1을 ν¬ν•¨ν•˜κ±°λ‚˜ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

정닡이 1을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄,

μ •λ‹΅μ˜ 첫 닡이 1κ³Ό κ²ΉμΉ˜μ§€ μ•ŠλŠ”λ‹€λ©΄, 1을 λ„£μ–΄μ„œ 닡을 더 길게 λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ λͺ¨μˆœμ΄λ‹€.

μ •λ‹΅μ˜ 첫 닡이 1κ³Ό κ²ΉμΉœλ‹€λ©΄, 첫번째 닡은 μ—¬μ „νžˆ 1보닀 늦게 λλ‚˜λ―€λ‘œ 이λ₯Ό λΉΌκ³  1을 λ„£μœΌλ©΄ μ—¬μ „νžˆ 닡이 λœλ‹€.

λ”°λΌμ„œ 정닡은 λ°˜λ“œμ‹œ 1을 ν¬ν•¨ν•œλ‹€κ³  ν•  수 μžˆλ‹€.

이제 1을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ ꡬ간에 λŒ€ν•΄μ„œ 닡을 κ΅¬ν•˜λ©΄ λœλ‹€.

 

 

3. κ°€μž₯ κ°€κΉŒμš΄ 점 : closest pair

n개의 2차원 점이 주어지고, κ°€μž₯ κ°€κΉŒμš΄ 두 점 μ‚¬μ΄μ˜ 거리λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. (x1-x2)^2 + (y1-y2)^2

 

(1) O(n^2 log n)

κ°€μž₯ λ‹¨μˆœν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, λͺ¨λ“  경우λ₯Ό λ‹€ κ΅¬ν•œλ’€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•˜μ—¬ 첫 값을 λ°˜ν™˜.

λͺ¨λ“  거리λ₯Ό κ΅¬ν•˜λŠ”λ°μ— O(n^2), 정렬에 O(n^2 log n)

 

(2) O(n log n) : λΆ„ν•  정볡

일단 점듀을 xμ’Œν‘œ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜κ³ , κ°€μš΄λ° 점을 κΈ°μ€€μœΌλ‘œ μ™Όμͺ½/ 였λ₯Έμͺ½μœΌλ‘œ λ‚˜λˆˆλ‹€. (반볡)

정렬은 O(n log n)이 κ±Έλ¦¬μ§€λ§Œ O(n)μ‹œκ°„μ— κ°€μš΄λ° 점만 μ•Œμ•„λ‚Ό 수 있음.

 

κ°€μž₯ κ°€κΉŒμš΄ 점의 μŒμ€ λ‹€μŒ 3가지 쀑 ν•˜λ‚˜μΌ 것이닀.

- μ™Όμͺ½ λΆ€λΆ„μ˜ κ°€μž₯ κ°€κΉŒμš΄ 쌍

- 였λ₯Έμͺ½ λΆ€λΆ„μ˜ κ°€μž₯ κ°€κΉŒμš΄ 쌍

- ν•œ 점은 μ™Όμͺ½μ—, ν•œ 점은 였λ₯Έμͺ½μ— μžˆλŠ” κ°€μž₯ κ°€κΉŒμš΄ 쌍

 

제일 ν—·κ°ˆλ Έλ˜ λΆ€λΆ„

 

μ—¬κΈ°μ„œ μ΅œλŒ€ 4개의 점만 κ³ λ €ν•˜λ©΄ λ˜λŠ” μ΄μœ λŠ”,

λ§Œμ•½ μ € μ‚¬κ°ν˜•μ—μ„œ μ™Όμͺ½ μ•„λž˜μ˜ 점을 κ³ λ €ν•œλ‹€λ©΄,

였λ₯Έμͺ½ 점듀 μ€‘μ—μ„œ 각 변이 d인 μ € μ‚¬κ°ν˜• λ‚΄λΆ€μ—λŠ” 꼭짓점인 4개의 μ κΉŒμ§€λ§Œ μ‘΄μž¬ν•  수 있고

점이 더 μ‘΄μž¬ν•œλ‹€λ©΄ μ• μ΄ˆμ— μ΅œμ†Œ 거리가 d보닀 μž‘κΈ° λ•Œλ¬Έμ— λͺ¨μˆœμ΄λ‹€.

λ”°λΌμ„œ ν•œ 점은 μ™Όμͺ½μ—, ν•œ 점은 였λ₯Έμͺ½μ— μžˆλŠ” κ°€μž₯ κ°€κΉŒμš΄ μŒμ„ 찾을 λ•Œ μ΅œλŒ€ 4nμ‹œκ°„μ΄ κ±Έλ¦Ό. -> O(n)

 

그리고 뢄할정볡을 μž¬κ·€μ μœΌλ‘œ μ§„ν–‰ν•˜κΈ° λ•Œλ¬Έμ—

결과적으둜 μ‹œκ°„λ³΅μž‘λ„λŠ”

T(n) = 2*T(n/2) + O(n) => O(n log n) 이닀.