๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ฅ ์ง๊ด์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ํจ๋ฌ๋ค์์ผ๋ก ์ต์ ํ ๋ฌธ์ (๊ฐ๋ฅํ ํด๋ค ์ค ๊ฐ์ฅ ์ข์(์ต๋/์ต์) ํด๋ฅผ ์ฐพ๋ ๋ฌธ์ )๋ฅผ ํด๊ฒฐํ๋ค.
๋ชจ๋ ์ ํ์ง๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ , ๊ฐ ๋จ๊ณ๋ง๋ค ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ๋ง์ ์ ํ (๊ทผ์์์ ํ๋)
-> ๊ทผ์์์ ์ธ ์ ํ์ผ๋ก ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ์ฐพ๊ณ , ์ด๋ค์ ๋ชจ์์(์ถ์ ํ์ฌ) ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ์ป๋๋ค.
๊ทผ์์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฒฝ์ฐ ์ต์ ์ ์ ๋ต์ ์ฐพ์์ฃผ์ง ๋ชปํ๋ค. ๊ทธ๋ ๊ธฐ์ ์ ๋น์ฑ ์ฆ๋ช ์ด ํ์์ !(ํด๊ฒฐ ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ์ ํ์ )
-ํ์์ ์ ํ ์์ฑ : ํ์์ ์ผ๋ก ์ ํํ๋๋ผ๋ ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค
-์ต์ ๋ถ๋ถ ๊ตฌ์กฐ : ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด์์ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๋ง๋ค ์ ์๋ค.
๊ทธ๋ฆฌ๋์ ์ฌ์ฉ
1. ๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
๊ฑฐ์ค๋ฆ๋ ์ก์์ ๋ํ ์ต์ ๋์ ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์
-๊ฑฐ์ค๋ฆ๋๋ณด๋ค ์์ ์ก์์ ๋์ ์ค ๊ฐ์ฅ ๋์ ์ก์์ ๋์ ์ ์ ํํ๊ณ ๊ฑฐ์ค๋ฆ๋ ๊ฐ์ ๊ฐฑ์ ํด์ค๋ค.
ex) ๊ฑฐ์ค๋ฆ๋์ด 720์์ด๋ผ๋ฉด,
500์ 1๊ฐ ์ ํ -> ๊ฑฐ์ค๋ฆ๋ 220
100์ 1๊ฐ ์ ํ -> ๊ฑฐ์ค๋ฆ๋ 120 , 100์ 1๊ฐ ์ ํ -> ๊ฑฐ์ค๋ฆ๋ 20
10์ 1๊ฐ ์ ํ -> ๊ฑฐ์ค๋ฆ๋ 10, 10์ 1๊ฐ ์ ํ -> ๊ฑฐ์ค๋ฆ๋ 0 -> ์ข ๋ฃ. ์ด ๋์ 5๊ฐ
๋์ ์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง์ด์ง๋ง ๊ฐ์ฅ ๋์ ์ก์์ ๋์ ์ ํญ์ ์ ํํ๋ฉด ๋์ ์ ์๋ฅผ ์ต์ํ์ผ๋ก ๋ฐํํ ์ ์๋ค.
๋์ ๊ฑฐ์ค๋ฆ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ์
๋ง์ฝ, 160์์ง๋ฆฌ ๋์ ์ด ์์ ๊ฒฝ์ฐ 200์์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์
์์ ์๊ณ ๋ฆฌ์ฆ์ ์ํ๋ฉด 200์์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ 160์์ง๋ฆฌ 1๊ฐ, 10์์ง๋ฆฌ 4๊ฐ๋ก ์ด 5๊ฐ๋ก ๋ฐํํ์ง๋ง
100์์ง๋ฆฌ ๋์ 2๊ฐ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ต์ ์ ํด์ด๋ค.
-> ํญ์ ์ต์ ์ ๋ต์ ์ฃผ์ง ๋ชปํ๋ค(์ค์ ๋ก๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋๋๋ก ๋์ ์ด ๋ฐํ๋จ.160์์ง๋ฆฌ ๋์ ์กด์ฌX)
2. ์ต์ ์ ์ฅ ํธ๋ฆฌ (Mininum Spanning Tree/MST)
์ฃผ์ด์ง ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ฌ์ดํด์ด ์์ด ๋ชจ๋ ์ ๋ค์ ์ฐ๊ฒฐ์ํจ ํธ๋ฆฌ(์ ์ฅํธ๋ฆฌ)๋ค ์ค ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ํธ๋ฆฌ
-> ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ : ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ๊ฐ์ ์ด ์ฌ์ดํด์ ๋ง๋ค์ง ์์ ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋ํ๊ฒ ๊ทธ ๊ฐ์ ์ ์ถ๊ฐ์ํจ๋ค.
-> ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ : ์์์ ์ ํ๋๋ฅผ ์ ํํ ํ, (n-1)๊ฐ์ ๊ฐ์ ์ ํ๋์ฉ ์ถ๊ฐ์์ผ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ n๊ฐ์ ํธ๋ฆฌ๋ค์ด ์ ์ฐจ ํฉ์ณ์ ธ์ 1๊ฐ์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๊ณ
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ 1๊ฐ์ ํธ๋ฆฌ๊ฐ ์๋ผ๋์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋๋ค.
*์ฝ๋ ๊ตฌํ์ ๋ค์ ํฌ์คํ ์
3. ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ(Shortest Path)
์ฃผ์ด์ง ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ด๋ ํ ์ถ๋ฐ์ ์์ ๋ ๋ค๋ฅธ ๋์ฐฉ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์
๋ํ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ(DIjstra) ์๊ณ ๋ฆฌ์ฆ์ด ์กด์ฌํ๋ค.
-์ฃผ์ด์ง ์ถ๋ฐ์ ์์ ์์
-์ถ๋ฐ์ ์ผ๋ก๋ถํฐ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ํ์ ๋์ง ์์ ์ ๋ค ์ค์์ ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ถ๊ฐํ๊ณ , ๊ทธ ์ ์์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ํ์ ํ๋ค.
-์์ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ถ๋ฐ์ ์ผ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํ์
4. ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ (Fractional Knapsack)
n๊ฐ์ ๋ฌผ๊ฑด๊ณผ ๊ฐ ๋ฌผ๊ฑด์ ๋ํ ๋ฌด๊ฒ์ ๊ฐ์น์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋, ์ต๋์ ๊ฐ์น๋ฅผ ๊ฐ๋๋ก ๋ฐฐ๋ญ์ ๋ฃ์ ๋ฌผ๊ฑด๋ค์ ์ ํ๋ ๋ฌธ์ .(๋ฐฐ๋ญ์๋ ํ์ ๋ ๋ฌด๊ฒ์ ๋ฌผ๊ฑด๋ค์ ๋ด์ ์ ์๋ค)
๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ์์๋ ๋ฌผ๊ฑด์ ๋ถ๋ถ์ ์ผ๋ก ๋ด๋ ๊ฒ์ ํ์ฉํ๋ค.(์ด๋ ํ ๋ฌผ๊ฑด์ 1/3๋งํผ ๋ด์ ์ ์์)
-๋จ์ ๋ฌด๊ฒ ๋น ๊ฐ์น๋ฅผ ๊ณ์ฐํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
-๋ฐฐ๋ญ์ ์ฌ์ ๊ฐ ์๋ ๋์ ๊ฐ์น๊ฐ ๋์ ๋ฌผ๊ฑด๋ค๋ถํฐ ์ฐจ๋ก๋ก ๊ฐ๋ฐฉ์ ๋ฃ๋๋ค.
5. ์งํฉ ์ปค๋ฒ ๋ฌธ์ (Set Cover)
n๊ฐ์ ์์๋ฅผ ๊ฐ์ง ์งํฉ U์ U์ ๋ถ๋ถ์งํฉ๋ค์ ์์๋ก ํ๋ ์งํฉ F๊ฐ ์ฃผ์ด์ง ๋, ์ต์ํ์ผ๋ก F์ ์์๋ค์ ์ ํํ์ฌ U๋ฅผ ๋ง๋๋ ๋ฌธ์
์ต์ ํด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์
-๋ชจ๋ ์กฐํฉ์ 1๊ฐ์ฉ ํฉ์งํฉํ์ฌ U๊ฐ ๋๋์ง ํ์ธํ๊ณ ์งํฉ ์๊ฐ ์ต์์ธ ๊ฒ์ ์ฐพ๋๋ค
ex) F={s1,s2,s3} ์ผ ๊ฒฝ์ฐ -> ์งํฉ์ด 1๊ฐ์ธ ๊ฒฝ์ฐ 3C1
-> ์งํฉ์ด 2๊ฐ์ธ ๊ฒฝ์ฐ 3C2
-> ์งํฉ์ด 3๊ฐ์ธ ๊ฒฝ์ฐ 3C3 => 3+3+1= 2^3-1 = 7
=> O(2^n) : NP์ ๋ํ์ ์ธ ์ ํ (์ต์ ํด๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ฌ์ค์ ๋ถ๊ฐ๋ฅ)
-U์ ์์๋ฅผ ๊ฐ์ฅ ๋ง์ด ๊ฐ์ง ์งํฉ๋ถํฐ ์ฐจ๋ก๋ก U์์ ์ ๊ฑฐ, ์ ๊ฑฐํ ์งํฉ์ ๊ฒฐ๊ณผ ์งํฉ์ ์ถ๊ฐ
์์ ๊ณผ์ ์ U๊ฐ ๊ณต์งํฉ์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ์ฌ ๊ทผ์ฌํด๋ฅผ ์ฐพ๋๋ค.
์๊ฐ๋ณต์ก๋
while์ ํ๋ฒ ๋ ๋(O(1))๋ง๋ค
๋ถ๋ถ์งํฉ Si ๋ค์ U์ ๊ฐ๊ฐ ๋น๊ต - n*O(n) = O(n^2)
์งํฉ U์์ Si์ ์์๋ฅผ ์ ๊ฑฐ - O(n)
Si๋ฅผ C์ ์ถ๊ฐ - O(1)
-> O(1)+O(n^2)+O(n)+O(1) = O(n^2)
while๋ฌธ์ ์ต๋ n๋ฒ ๋ฐ๋ณต
=>n*O(n^2) = O(n^3)
์๊ณ ๋ฆฌ์ฆ ๊ตฌํ(python)
Cities = set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Schools = {}
Schools[1] = set([1, 2, 3, 8])
Schools[2] = set([1, 2, 3, 4, 8])
Schools[3] = set([1, 2, 3, 4])
Schools[4] = set([2, 3, 4, 5, 7, 8])
Schools[5] = set([4, 5, 6, 7])
Schools[6] = set([5, 6, 7, 9, 10])
Schools[7] = set([4, 5, 6, 7])
Schools[8] = set([1, 2, 4, 8])
Schools[9] = set([6, 9])
Schools[10] = set([6, 10])
finalCities=set()
while Cities:
bestCity =None##์ํฐ ๋ฒํธ
schoolCovered = set()
for school,cities in Schools.items():
covered=Cities & cities #๊ต์งํฉ ์ฐ์ฐ
if len(covered)>len(schoolCovered):
bestCity=school
schoolCovered=covered
##๊ฐ์ฅ ๋ง์ด ์์๋ฅผ ์ง๋ ์งํฉ ์ฐพ์
Cities-=schoolCovered #์ฐจ์งํฉ
finalCities.add(bestCity)
print(finalCities)
6-1. ๊ตฌ๊ฐ ์ค์ผ์ค๋ง(Interval scheduling)
n๊ฐ์ task ์ 1๊ฐ์ ํ๋ก์ธ์๊ฐ ์์ ๋, ์ํ์๊ฐ์ด ๊ฒน์น์ง ์์ผ๋ฉด์ ๊ฐ์ฅ ๋ง์ taksk๋ฅผ ์ํํ ์ ์๋๋ก task๋ฅผ ์ ํํ๋ ๋ฌธ์ (๊ฐ task๋ ์์,์ข ๋ฃ ์๊ฐ์ ๊ฐ๋๋ค)
์ข ๋ฃ ์๊ฐ์ด ๋น ๋ฅธ ์์๋๋ก ์ ๋ ฌํ์ฌ ์ ํํ๋ค.
-๊ฐ์ฅ ์ผ์ฐ ์ข ๋ฃํ๋ task ์ ํ
-๊ทธ ๋ค์์ผ๋ก ์ ํ๋ ๋์๋ฆฌ์ ์์์๊ฐ๊ณผ ์ง์ ์ ์ ํ๋ ๋์๋ฆฌ์ ์ข ๋ฃ์๊ฐ์ ๋น๊ตํ์ฌ ์ ํ/ํฌ๊ธฐ
์๊ณ ๋ฆฌ์ฆ ๊ตฌํ(python)
meeting = [['C1', 8.0, 13.0], ['C2', 9.0, 11.0], ['C3', 10.5, 11.5], ['C4', 11.0, 14.0],
['C5', 13.0, 16.0], ['C6', 14.0, 15.0], ['C7', 15.0, 17.0]]
meeting.sort(key=lambda x: x[2])
schedule=[meeting[0]]
i=0
for j in range(1,len(meeting)):
if meeting[i][2]<=meeting[j][1]: #๊ทธ ์ ์ข
๋ฃ์๊ฐ๋ณด๋ค ์ง๊ธ ์์์๊ฐ์ด ๋๋ฆฌ๋ฉด
schedule.append(meeting[j])
i=j
print(schedule)
6-2. ๊ตฌ๊ฐ ๋ถํ (Interval Partitioning)
n๊ฐ์ task๊ฐ ์์ ๋, ๋ชจ๋ Task๋ฅผ ์ํ์๊ฐ์ด ๊ฒน์น์ง ์์ผ๋ฉด์ ์ต์ํ์ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฐฐ์ ํ๋ ๋ฌธ์ (๊ฐ task๋ ์์,์ข ๋ฃ ์๊ฐ์ ๊ฐ๋๋ค)
์์ ์๊ฐ์ด ๋น ๋ฅธ ์์๋๋ก ์ ๋ ฌํ์ฌ ์ ํํ๋ค.
-๊ฐ์ฅ ๋นจ๋ฆฌ ์์ํ๋ task ์ ํ(์๋ก์ด ํ๋ก์ธ์)
-๊ทธ ๋ค์์ผ๋ก ์ ํ๋ ๋์๋ฆฌ์ ์์์๊ฐ๊ณผ ๋ง๋ค์ด์ง ํ๋ก์ธ์๋ค์ task ์ข ๋ฃ์๊ฐ์ ๋น๊ตํ์ฌ ๋ค์ด๊ฐ ํ๋ก์ธ์๊ฐ ์์ผ๋ฉด task ์ถ๊ฐ ํ ์ข ๋ฃ ์๊ฐ ๊ฐฑ์ , ์์ผ๋ฉด ์๋ก์ด ํ๋ก์ธ์ ์์ฑ
์๊ฐ ๋ณต์ก๋
task ์ ๋ ฌ - O(nlogn)
n๊ฐ์ task, m๊ฐ์ ํ๋ก์ธ์ - O(m)*n=O(mn)
=> O(nlogn)+O(mn)
์๊ณ ๋ฆฌ์ฆ ๊ตฌํ(python)
meeting = [['C1', 9.0, 11.0], ['C2', 9.0, 12.5], ['C3', 13.0, 14.5],
['C4', 14.0, 17.0], ['C5', 11.0, 14.0], ['C6', 9.0, 11.0],
['C7', 15.0, 16.5], ['C8', 15.0, 16.5], ['C9', 11.0, 12.5],
['C10', 13.0, 14.5]]
meeting.sort(key=lambda x:x[1])
schedule=[[meeting[0]]]
finishTime=[meeting[0][2]]
k=0 #๋ฏธํ
๋ฃธ ๋ฒํธ
for i in range(1,len(meeting)):
flag=False
for j in range(k+1):
if meeting[i][1]>=finishTime[j]:
#๋ค๋ฅธ ํ์ ์์์๊ฐ์ด ์ข
๋ฃ์๊ฐ๋ฐฐ์ด ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์๋
flag=True
finishTime[j]=meeting[i][2]
schedule[j].append(meeting[i])
break
if not flag: ##๋ฐฐ์ ํ ์ ์๋ ๋ฐฉ์ด ์์ผ๋ฉด
schedule.append(meeting[i])
k+=1
finishTime.append(meeting[i][2])
for i in range(k+1):
print('Room',i+1,':',schedule[i])
7.ํํ๋ง ์์ถ(Huffman)
ํํ๋ง ์์ถ : ํ์ผ์ ๋น๋ฒํ๊ฒ ๋ํ๋๋ ๋ฌธ์์๋ ์งง์ ์ด์ง์ฝ๋๋ฅผ ํ ๋นํ๊ณ , ๋๋ฌผ๊ฒ ๋ํ๋๋ ๋ฌธ์์๋ ๊ธด ์ด์ง์ฝ๋๋ฅผ ํ ๋นํ์ฌ ์์ถ. ์์ถ ๋ฐฉ๋ฒ์ผ๋ก ๋ณํ์ํจ ๋ฌธ์ ์ฝ๋๋ค ์ฌ์ด์๋ ์ ๋๋ถ ํน์ฑ(prefix property: ํ ๋น๋ ์ด์ง์ฝ๋๋ ๋ค๋ฅธ ๋ฌธ์์ ํ ๋น๋ ์ด์ง์ฝ๋์ ์ ๋๋ถ๊ฐ ๋์ง ์๋๋ค)์ด ์กด์ฌ. ๋ฌธ์์ ๋น๋์์ ๊ธฐ๋ฐ์ ๋ ์ด์งํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ๋์๋๋ ์ด์ง์ฝ๋๋ฅผ ํ ๋นํ๋ค.(ํํ๋ง ์ฝ๋)
ํํ๋ง ์ฝ๋ ๋ฌธ์ ๋ n๊ฐ์ ๋ฌธ์์ ๋ํ ๊ฐ๊ฐ์ ๋น๋์๊ฐ ์ ๋ ฅ๋๋ฉด ํํ๋ง ํธ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
-๊ฐ ๋ฌธ์ ๋น ๋ ธ๋๋ฅผ ๋ง๋ค์ด ๋น๋์๋ฅผ ์ ์ฅ
-๋น๋์์ ๋ํด ์ฐ์ ์์ํ(PQ)๋ฅผ ์์ฑ
-PQ์ ์๋ ๋ ธ๋์๊ฐ 2์ด์์ด๋ฉด ๋น๋์๊ฐ ๊ฐ์ฅ ์ ์ ๋ ธ๋(A,B) 2๊ฐ๋ฅผ ์ ๊ฑฐํ์ฌ ์๋ก์ด ๋ ธ๋ N์ ๋ง๋ค์ด ์์๋ ธ๋๋ก ๋ง๋ ๋ค (N์ ๋น๋์=A์ ๋น๋์ + B์ ๋น๋์)
-PQ์ ์ถ๊ฐ
์๊ฐ๋ณต์ก๋
๋ ธ๋ ์์ฑ ๋ฐ ๋น๋์ ์ ์ฅ -> O(n)
์ฐ์ ์์ Q ์์ฑ -> O(n) (์ด์ง ํ ์๋ฃ๊ตฌ์กฐ)
๋ ธ๋ 2๊ฐ ์ ๊ฑฐ ๋ฐ N ๋ ธ๋ ์ฝ์ * n-1๋ฒ ๋ฐ๋ณต-> O(logn)*(n-1) = O(nlogn)
ํธ๋ฆฌ์ ๋ฃจํธ ๋ฐํ -> O(1)
=> O(n)+O(n)+O(nlogn)+O(1) = O(nlogn)
'๐ปAlgorithm > ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋ฆฌ๋(Greedy) - ์ต์์ ์ฅํธ๋ฆฌ(MST) (0) | 2022.04.18 |
---|---|
๋์ ๊ณํ ์๊ณ ๋ฆฌ์ฆ(DP/Dynamic Programming) (0) | 2022.04.18 |
๋ถํ ์ ๋ณต(Divide and Conquer) - ์ต๊ทผ์ ์ ์ ์ ์ฐพ๊ธฐ (0) | 2022.04.11 |
๋ถํ ์ ๋ณต(Divide and Conquer) (0) | 2022.04.10 |