Today I Learn (20220331)
์ค๋์ ๋ฌธ์ ๋ฅผ ํ๋๋ ์์ง ๋ค ๋ชปํ์๋ค... ๊ทธ๋ ์ง๋ง ์ค๋์ ์ด์ ์ ์ด์ด ์ฐ์ ์์ ํ์ ๋ค์ต์คํธ๋ผ์ ๋ํด ๋ฐฐ์ ๋ค. ์๊ณ ๋ฆฌ์ฆ์ ์ธ๊ณ๋ ๋ฐฐ์ฐ๋ฉด ๋ฐฐ์ธ์๋ก ๋ฌด๊ถ๋ฌด์ง ํ๊ฑฐ ๊ฐ๋ค...ใ ใ ์ด์ ์ข.. ๋ฆ๊ฒ์ค๋๋ ์ปจ๋์ ์ด ๋งค์ฐ ์ ์กฐํ์ง๋ง ์ ๊ฒ ์๊ฑฐ ์น๊ณ ์์ ์ ๋ง ์ด์ฌํ ๋ค์๋ค. ๋ณต์ต๋ง์ด ์ด๊ธธ,, ๊ทผ๋ฐ ๋ค์์ฃผ ๊ณผ๋ชฉํ๊ฐ๊ฐ ๋งค์ฐ ๊ฑฑ์ ๋๋ค. ์ฃผ๋ง์ ์ต๋ํ ๋ฌธ์ ๋ฅผ ๋ง์ด ํ์ด๋ณด๊ณ ์ด์ ๊น์ง ๋ฐฐ์ด ์๊ณ ๋ฆฌ์ฆ์ ํค์๋๋ฅผ ๋์ธ๊ฒจ ๋ณด๋ ์๊ฐ์ ๊ฐ๋๋ก ํด์ผ๊ฒ ๋ค. ๋ค์ต์คํธ๋ผ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๋ณด๋๊น ์กฐ๊ธ์ฉ ์ ๊ฑฐ ๊ฐ๋ค. ์ด์ ์ด๋ฅผ ์ฝ๋์ ์ ๋ชฉ์์ผ ์ฝ๋๋ก ๊ตฌํํ๊ณ ๋ค์์ฃผ์ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ๋ค์ ์ฌ๋ฌ๊ฐ ํ์ด์ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์ด์ผ๊ฒ ๋ค.
์ฐ์ ์์ ํ
**ํ(Queue)**๋ ์ ์ ์ ์ถ ํ์์ ์๋ฃ๊ตฌ์กฐ.
**์ฐ์ ์์ ํ(Priority Queue)**๋ ๋จผ์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ, ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ํํ์ ์๋ฃ๊ตฌ์กฐ.
์ด๋ฅผ ์ฐ๋ฆฌ๋ **ํ(Heap)**์ ์ด์ฉํ์ฌ ๊ตฌํ.
Min heap
# insert๊ณผ์ -- headq๋ default๊ฐ์ด Min heap์ด๋ค.
import heapq
arr= []
heapq.heappush(arr,1)
heapq.heappush(arr,3)
heapq.heappush(arr,4)
print(arr)
#top() and pop()๊ณผ์ -- list์ ์๋๊ฑฐ ๋ณด๋ค ๋ง์ด ์คํ์ ์ค๋ฅ
print(heaq.headpop(arr))
print(heaq.headpop(arr))
print(heaq.headpop(arr))
#tuple์ ํตํ ์ฐ์ ์์ ์ง์
import heapq
arr=[]
heapq.heappush(arr,(1,'hi'))
heapq.heappush(arr,(3,'am'))
heapq.heappush(arr,(2,'i'))
heapq.heappush(arr,(4,'iseo'))
for i in range(len(arr)):
print(heapq.heappop(arr)[1], end=' ')
# ๋ฆฌ์คํธ๋ฅผ heap์ ์๋ฃ์ฉ์ผ๋ก ํ๋ฒ์ ๋ณํํ๊ธฐ
import heapq
arr=[1232,5,3,1,5]
heapq.heapify(arr)
#heap์ ์๋ฃํ์ด๋๊น ๋ฃจํฌ๋
ธ๋์ ๊ฐ์ ๊ฐ์ฅ ์์ ๊ฐ.....
#๋๋จธ์ง๋ ๊ฑ ์ ๋ ฌ ์๋จ
print(*arr)
for i in range(len(arr)):
print(heapq.heappop(arr))
Max heap
- ํํ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
- ์์(-)๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ(๋๋ค ์ฌ์ฉ ๊ฐ๋ฅ)
- ํํ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
import heapq
#Max heap๋ง๋ค๊ธฐ
arr = []
#ํํ์ ์ฐ์ ์์๋ฅผ ์ด์ฉํด ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ
heapq.heappush(arr,(-1,1))
heapq.heappush(arr,(-3,3))
heapq.heappush(arr,(-8,8))
for i in range(len(arr)):
print(heapq.heappop(arr)[1])
- ์์(-)๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
import heapq
#์์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
#์ฐ๋ฆฌ๊ฐ ์ถ๋ ฅํ ๊ฐ์ - ๋ถ์ฌ push
#popํ ๋ -๋ฅผ ๋ถ์ฌ ๋ค์ ์์๋ก ๋์ค๊ฒ ํจ.
arr=[]
heapq.heappush(arr,-1)
heapq.heappush(arr,-4)
heapq.heappush(arr,-7) #-7์ด ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค
for i in range(len(arr)):
print(-heapq.heappop(arr)) #๊ฐ์ฅ ๋จผ์ ๋์ค๋ -7์ ๋ค์ -๋ฅผ ๋ถ์ฌ ์์ ํํ๋ก ์ถ๋ ฅ
priority queue๋ฅผ ์ด์ฉํด max heap์ถ๋ ฅํ์์ค.
import heapq
arr=[11,12,6,8,10,4]
maxheap=[]
for i in range(len(arr)):
heapq.heappush((maxheap,(-arr[i],arr[i]))
for i in range(len(arr)):
print(heapq.heappop(maxheap)[1])
๋๋ค์ ์ด์ฉ
import heapq
arr=[11,12,6,8,10,4]
rev=lambda x:x*-1
#arr๊ฐ์ ์์๋ฅผ ๋ถ์ฌ์ maxheap ๋ฆฌ์คํธ ๋ง๋ ํ
maxheap = list(map(rev,arr))
#heap์ ์๋ฃํ์ผ๋ก ๋ฐ๊พธ๊ณ
heapq.heapify(maxheap)
#์์ ๋ถ์ฌ์ ์ถ๋ ฅํ๊ธฐ
for i in range(len(maxheap)):
print(-heapq.heappop(maxheap))
์ฐ์ต๋ฌธ์
์นด๋ ์ ๋ ฌํ๊ธฐ
์ ๋ ฌ๋ ๋ ๋ฌถ์์ ์ซ์ ์นด๋๊ฐ ์๋ค๊ณ ํ์. ๊ฐ ๋ฌถ์์ ์นด๋์ ์๋ฅผ A, B๋ผ ํ๋ฉด ๋ณดํต ๋ ๋ฌถ์์ ํฉ์ณ์ ํ๋๋ก ๋ง๋๋ ๋ฐ์๋ A+B ๋ฒ์ ๋น๊ต๋ฅผ ํด์ผ ํ๋ค. ์ด๋ฅผํ
๋ฉด, 20์ฅ์ ์ซ์ ์นด๋ ๋ฌถ์๊ณผ 30์ฅ์ ์ซ์ ์นด๋ ๋ฌถ์์ ํฉ์น๋ ค๋ฉด 50๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค.
๋งค์ฐ ๋ง์ ์ซ์ ์นด๋ ๋ฌถ์์ด ์ฑ
์ ์์ ๋์ฌ ์๋ค. ์ด๋ค์ ๋ ๋ฌถ์์ฉ ๊ณจ๋ผ ์๋ก ํฉ์ณ๋๊ฐ๋ค๋ฉด, ๊ณ ๋ฅด๋ ์์์ ๋ฐ๋ผ์ ๋น๊ต ํ์๊ฐ ๋งค์ฐ ๋ฌ๋ผ์ง๋ค. ์๋ฅผ ๋ค์ด 10์ฅ, 20์ฅ, 40์ฅ์ ๋ฌถ์์ด ์๋ค๋ฉด 10์ฅ๊ณผ 20์ฅ์ ํฉ์น ๋ค, ํฉ์น 30์ฅ ๋ฌถ์๊ณผ 40์ฅ์ ํฉ์น๋ค๋ฉด (10 + 20) + (30 + 40) = 100๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค. ๊ทธ๋ฌ๋ 10์ฅ๊ณผ 40์ฅ์ ํฉ์น ๋ค, ํฉ์น 50์ฅ ๋ฌถ์๊ณผ 20์ฅ์ ํฉ์น๋ค๋ฉด (10 + 40) + (50 + 20) = 120 ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ฏ๋ก ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
N๊ฐ์ ์ซ์ ์นด๋ ๋ฌถ์์ ๊ฐ๊ฐ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง ๋, ์ต์ํ ๋ช ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์
๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100,000) ์ด์ด์ N๊ฐ์ ์ค์ ๊ฑธ์ณ ์ซ์ ์นด๋ ๋ฌถ์์ ๊ฐ๊ฐ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง๋ค. ์ซ์ ์นด๋ ๋ฌถ์์ ํฌ๊ธฐ๋ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต์ ๋น๊ต ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
์
๋ ฅ
4
50
20
70
30
์ถ๋ ฅ
320
์
๋ ฅ
3
10
20
40
์ถ๋ ฅ
100
import heapq
n=int(input())
card=[]
#์
๋ ฅ ๋ฐ์ ์นด๋ insert
for i in range(n):
heapq.heappush(card,int(input()))
answer = 0
while len(card)>1: #์นด๋ ๋ฌถ์์ ๊ฐ์๊ฐ 1๊ฐ๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณต
#๊ฐ์ฅ ์์ ๋ฌถ์ ์นด๋ ๋นผ์ค๊ณ
temp1=heapq.heappop(card)
#๊ทธ๋ค์ ์์ ์นด๋ ๋ฌถ์ ๋นผ์ค๊ธฐ
temp2=heapq.heappop(card)
#๋๊ฐ๋ฅผ ํฉํ ๊ฒ์ด ๋น๊ต ํ์. ์ด ๋น๊ตํ์๋ฅผ ๊ตฌํ๋ answer๋ณ์
answer+=(temp1+temp2)
#๋ค์ ํ ๋ฌถ์์ด ๋ ์นด๋ pushํ๊ธฐ
heapq.heappush(card,temp1+temp2)
print(answer)
๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
- ํ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ๋์ฐฉ์ ๊น์ง ๋๋ ์ต์ ๋น์ฉ ๋๋ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ ๋ ์ด์ฉ! - ํจ์จ์ฑ ๋์ฌ์ฃผ๊ณ ๋น ๋ฅธ ์๋.
- ๊ฐ์ ์ ์ ๋ณด๋ ๋ชจ๋ ์์์ฌ์ผํจ(๊ฐ์ค์น๊ฐ ์์์ฌ์ผ ํจ)
- โป ์์๊ฐ ์๋ค๋ฉด bellman -ford์๊ณ ๋ฆฌ์ฆ ์ด์ฉ
- ์๋ฐฉํฅ, ๋จ๋ฐฉํฅ ๊ฐ๋ฅ
โป Floyd washall์ ๋ชจ๋ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ ๋ ์ฌ์ฉ
์ด์ฉ ๋ฐฉ๋ฒ
์๋ฆฌ๋ ๊ฐ๋จํ๋ค.
์์-> ๋์ฐฉ vs ์์์ ->๊ฒฝ์ ์ง->๋์ฐฉ ์ด ๋ ์ค ์์ ๊ฐ์ผ๋ก result๋ฅผ ๊ฐฑ์
- ์ด์ค for๋ฌธ์ ์ด์ฉ (O(n^2)) - ์ธ์ ํ๋ ฌ ์ด์ฉ
- Priority Queue ์ด์ฉ (O(nlogn)) - ์ธ์ ๋ฆฌ์คํธ ์ด์ฉ
์ด์ค for๋ฌธ์ ์ด์ฉ (O(n^2)) - ์ธ์ ํ๋ ฌ ์ด์ฉ
name='ABCDE'
inf=99999
arr=[
[0, 3, inf, 9, 5],
[inf, 0, 7, inf, 1],
[inf, inf, 0, 1, inf],
[inf, inf, inf, 0, inf],
[inf, inf, 1, inf, 0]]
used=[0]*5
used[0]=1 # ์์์ A์ ํด๋นํ๋ used๋ฐฐ์ด์ 1 ์ฒดํฌ
result=[0, 3, inf, 9, 5]
def select_ky():
minn=99999
minindex=0
for i in range(5): # result ๋ฐฐ์ด์ ํ์ํ๋๋ฐ
if used[i]==0 and result[i]<minn: # ๊ฐ์ด ๊ฐ์ฅ ์๊ณ
minn=result[i] # ๊ฒฝ์ ์ง๋ก ํํ์ ์ด ์๋ ์ ์ ์ด๋ผ๋ฉด
minindex=i
return minindex
def dijk():
for i in range(4):
via=select_ky() # ๊ฒฝ์ ์ง๋ฅผ ์ ํด์ ๋ฐํํ๋ ํจ์
used[via]=1 # ๊ฒฝ์ ์ง๋ก ํํ ๊ณณ์ used๋ฐฐ์ด๊ฐ์ 1๋ก ์ฒดํฌ
for j in range(5):
baro=result[j] # ์์์ ->๋ค๋ฅธ์ ์ (๋์ฐฉ์ง)
kyung=result[via]+arr[via][j] # (์์->๊ฒฝ์ ) + (๊ฒฝ์ ->๋ค๋ฅธ์ ์ (๋์ฐฉ์ง))
if baro>kyung: # ๊ฒฝ์ ์ง ๋ค๋ ธ๋ค ๊ฐ๋๊ฒ์ด ๋ ์ ๋ ดํ๋ฉด
result[j]=kyung # result ๋ฐฐ์ด ๊ฐฑ์
dijk()
print(*result)
Priority Queue ์ด์ฉ (O(nlogn)) - ์ธ์ ๋ฆฌ์คํธ ์ด์ฉ
#์
๋ ฅ์์ ์
๋๋ค
5
7
0 1 3
0 3 9
0 4 5
1 2 7
1 4 1
2 3 1
4 2 1
0 2
์ถ๋ ฅ์์ ์
๋๋ค.
5
5 # ์ ์ ์ ๊ฐ์
7 # ๊ฐ์ ์ ์ ๋ณด
0 1 3
0 3 9 # ์์์ง ๋์ฐฉ์ง ๋น์ฉ
0 4 5
1 2 7
1 4 1
2 3 1
4 2 1
0 3 # ์์์ง ๋์ฐฉ์ง
import heapq
n = int(input()) # ์ ์ ์ ๊ฐ์
m = int(input()) # ๊ฐ์ ์ ์ ๋ณด
graph = [[] for _ in range(n)]
for _ in range(m):
a, b, c = map(int, input().split()) # ์์์ # ๋์ฐฉ์ # ๋น์ฉ
graph[a].append((b, c))
start, target = map(int, input().split()) # ์์์ (start) ์ผ๋ก ๋ถํฐ ๋์ฐฉ์ (target) ๊น์ง ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ
inf = int(21e8)
result = [inf] * n
def dijkstra(start):
result[start] = 0 # ์์์ start ์ ํด๋นํ๋ result ๊ฐ์ 0 A ๋ฅผ ๊ฒฝ์ ์ง๋ก ์ฒ์์ ์
ํ
heap = []
heapq.heappush(heap, (0, start))
while heap:
si_ky_cost, kyungyou = heapq.heappop(heap)
if si_ky_cost > result[kyungyou]: # ์ ๊ณผ์ ์์ ๊ฐฑ์ ๋ ์์์ ์์ ๊ฒฝ์ ์ง ๊น์ง์ result ๊ฐ๋ณด๋ค
continue # ๋ฐฉ๊ธ ๋ฝ์๋ธ ์์์ ์์ ๊ฒฝ์ ์ง ๊น์ง์ ๋น์ฉ์ด ๋ ํฌ๋ฉด
# ๋๊ฒจ๋ผ ์ด๋ฏธ ๊ฒฝ์ ์ง๋ก ํํด์ ์
๋๋ ๊ณณ์ด๋ค
#si_ky_do_cost ( ์์->๊ฒฝ์ + ๊ฒฝ์ -> ๋์ฐฉ ) vs result[i[0]] (์์์ -> ๋์ฐฉ) ํ ๊ฒ์ด๋ค.
for i in graph[kyungyou]:
si_ky_do_cost = si_ky_cost + i[1] # ์์์ ์์ ๊ฒฝ์ ์ง ๊ฐ๋ค๊ฐ ๋์ฐฉ์ ๊ฐ๋ ๋น์ฉ๋ถํฐ ๊ตฌํจ.
if si_ky_do_cost < result[i[0]]: # ๋น๊ตํ ๊ฒฝ์ ์ง ๋ค๋ ธ๋ค ๊ฐ๋๊ฒ์ด ๋ ์ ๋ ดํ๋ฉด
result[i[0]] = si_ky_do_cost # result ๋ฐฐ์ด ๊ฐฑ์
heapq.heappush(heap, (si_ky_do_cost, i[0])) # heap์ ๊ฐฑ์ ๋!! ๋ด์ฉ push ํ๊ธฐ
dijkstra(start)
print(result[target])
'๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.04.06.์ (0) | 2022.04.06 |
---|---|
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.04.05.ํ (0) | 2022.04.06 |
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.04.04.์ (0) | 2022.04.04 |
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.03.30.์ (0) | 2022.03.30 |
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.03.29.ํ (0) | 2022.03.30 |
๋๊ธ