๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง 2022.03.30.์ˆ˜

by DevIseo 2022. 3. 30.

Today I Learn (20220330)


์˜ค๋Š˜ ์˜ค์ „์—๋Š” ๊ต์ˆ˜๋‹˜๊ป˜์„œ ์ €๋ฒˆ์— ์ฃผ์‹  BFS๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๋Š”๋ฐ ๋ณด๋ƒˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์†Œํ™”๊ธฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฐพ๊ณ  ๋ถˆ์„ ์ฐพ์•„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด ๊ทธ ์†Œํ™”๊ธฐ ์ค‘ ๋˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์˜€๋Š”๋ฐ... ๋‚ด ์ฝ”๋“œ๋Š” ์†Œํ™”๊ธฐ๋งŒ ์ฐพ๊ณ  ๋๋‚˜๋Š” ์ฝ”๋“œ๋กœ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ถ„์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ ๋ฐ›์•˜๋‹ค.

๊ตฌํ˜„ ์ˆœ์„œ๋Š”

  1. ๋ถˆ, ์†Œํ™”๊ธฐ ์œ„์น˜๋ฅผ ์ฐพ๊ณ 
  2. for ๋ฌธ์„ ํ†ตํ•ด ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์†Œํ™”๊ธฐ๊นŒ์ง€, ์†Œํ™”๊ธฐ๋ถ€ํ„ฐ ๋ถˆ๊นŒ์ง€ bfs ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , ์—ฌ๊ธฐ์„œ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์„ list์— ๋„ฃ๊ณ  ๊ทธ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ํ…Œ์ผ€์—์„œ ๋ถˆ์„ ์ง€๋‚˜๊ฐ€๋ฉด ์•ˆ๋˜๋Š” ์กฐ๊ฑด์„ ๋ฌด์‹œํ•œ์ฒด ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ”๋‹ค.

๊ทธ๋ž˜์„œ bfsํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— isfindFire์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด ์†Œํ™”๊ธฐ๋ฅผ ์ฐพ์œผ๋Ÿฌ ๊ฐˆ๋•Œ๋Š” ๋ถˆ์„ ๋ชป์ง€๋‚˜๊ฐ€๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , ์†Œํ™”๊ธฐ์—์„œ ๋ถˆ๊นŒ์ง€๋Š” ๋‹ค์‹œ ๋ถˆ์„ ์ฐพ๊ฒŒ ๋งŒ๋“ค์–ด ์คฌ๋‹ค.

๊ทธ๋ž˜์„œ ์ตœ์ข…์ ์ธ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#๋ชจ์˜ ์†Œ๋ฐฉํ›ˆ๋ จ์„ ์‹ค์‹œํ•˜๋Š” ๋‚ ์ž…๋‹ˆ๋‹ค.
from collections import deque
n = int(input())
arr = [list(input()) for _ in range(n)]
sy,sx=map(int,input().split())

#๋ถˆ ์œ„์น˜, ์†Œํ™”๊ธฐ ์œ„์น˜ ์ฐพ๊ธฐ
fire=[]
ext=[]
for k in range(n):
    for l in range(n):
        if arr[k][l] == '$':
            fire.append((k,l))
        if arr[k][l] == 'A':
            ext.append((k,l))


def bfs(sy,sx,ey,ex,isfindFire): #๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” ๋ถˆ์„ ์ง€๋‚˜๊ฐ€๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋„ฃ์–ด์คŒ!
    q = deque()
    q.append((sy,sx,ey,ex,0))
    visit=[[0]*n for _ in range(n)]

    while q:

        sy,sx,ey,ex,move = q.popleft()

        directy=[-1,1,0,0]
        directx=[0,0,-1,1]

        if sy == ey and sx==ex:
            return move

        for i in range(4):
            dy=sy+directy[i]
            dx=sx+directx[i]

            if 0<=dy<n and 0<=dx<n:
                if visit[dy][dx]==0 and arr[dy][dx]!='#':
                    if isfindFire: #๋ถˆ์„ ์ฐพ์„ ๋•Œ
                        visit[dy][dx]=1
                        q.append((dy,dx,ey,ex,move+1))
                    else: #์†Œํ™”๊ธฐ ์ฐพ์„ ๋•Œ
                        if arr[dy][dx]!='$':
                            visit[dy][dx] = 1
                            q.append((dy, dx, ey, ex, move + 1))


result=[]
for i in range(len(ext)):
    a = bfs(sy,sx,ext[i][0],ext[i][1],False) #์‹œ์ž‘์  ๋ถ€ํ„ฐ ์†Œํ™”๊ธฐ๊นŒ์ง€
    b = bfs(ext[i][0],ext[i][1],fire[0][0],fire[0][1],True) #์†Œํ™”๊ธฐ๋ถ€ํ„ฐ ๋ถˆ๊นŒ์ง€
    result.append(a+b)

print(min(result))

+)์˜ค๋Š˜์€ knapsack๊ณผ heap์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค. ์•„์ง๋„ DP๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ ์ž์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•™์Šต์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ๋Š๋‚Œ์ด ๋งค์ผ๋งค์ผ ๊ฐ•๋ ฌํ•˜๊ฒŒ ๋“ ๋‹ค. ์ด๋ฒˆ์ฃผ ๋ฉ˜ํ† ๋ง์—์„œ ๋‹ค์‹œ DP๋ฅผ ๋ณต์Šตํ•˜๊ฒŒ ๋  ๊ฑฐ ๊ฐ™์€๋ฐ ๋‚จ๋“ค๋ณด๋‹ค ๋” ๋งŽ์ด ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค.....ใ… ใ…  ์ผ๋‹จ ์˜ค๋Š˜์€ ๊ต์ˆ˜๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ํŠธ๋ ˆ์ด์Šค ํ•˜๋ฉฐ ๋‹ค์‹œ ํ˜ผ์ž ์ ์–ด๋ณด๋Š” ์—ฐ์Šต์„ 3๋ฒˆ ์ด์ƒ์€ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

knapsack


  • Fractinoal Knapsack
  • 0/1 (=>DP๋ฌธ์ œ)

**๋ฐฐ๋‚ญ ๋ฌธ์ œ**(Knapsack Problem ๋ƒ…์ƒ‰ ํ”„๋ผ๋ธ”๋Ÿผ[[*](https://ko.wikipedia.org/wiki/์œ„ํ‚ค๋ฐฑ๊ณผ:์˜์–ด์˜_ํ•œ๊ธ€_ํ‘œ๊ธฐ)])๋Š” [์กฐํ•ฉ ์ตœ์ ํ™”](https://ko.wikipedia.org/wiki/์กฐํ•ฉ_์ตœ์ ํ™”)์˜ ์œ ๋ช…ํ•œ ๋ฌธ์ œ์ด๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ํ•œ ์—ฌํ–‰๊ฐ€๊ฐ€ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Š” ๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •ํ•ด์ ธ ์žˆ๊ณ , ์ผ์ • ๊ฐ€์น˜์™€ ๋ฌด๊ฒŒ๊ฐ€ ์žˆ๋Š” ์ง๋“ค์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ๋•Œ, ๊ฐ€์น˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ์ง์„ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ด ๋ฐฐ๋‚ญ๋ฌธ์ œ๋Š” ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(๋ฌด๊ฒŒ๊ฐ€ [์†Œ์ˆ˜])์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ)์™€ ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์ด ๊ฒฝ์šฐ ์ง์˜ ๋ฌด๊ฒŒ๋Š” 0 ์ด์ƒ์˜ ์ •์ˆ˜๋งŒ ๊ฐ€๋Šฅ) ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ๋ฐฐ๋‚ญ๋ฌธ์ œ๋ฅผ **๋ถ„ํ• ๊ฐ€๋Šฅ ๋ฐฐ๋‚ญ๋ฌธ์ œ**(Fractional Knapsack Problem), ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์˜ ๋ฐฐ๋‚ญ๋ฌธ์ œ๋ฅผ **0-1 ๋ฐฐ๋‚ญ๋ฌธ์ œ**(0-1 Knapsack Problem)๋ผ ๋ถ€๋ฅธ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” [๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜]์œผ๋กœ [๋‹คํ•ญ ์‹œ๊ฐ„], ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” [๋™์ ๊ณ„ํš๋ฒ•](Dynamic Programming)๋“ฑ์œผ๋กœ [์˜์‚ฌ ๋‹คํ•ญ ์‹œ๊ฐ„]์— ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” [NP-์™„์ „]์ด๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๋ ค์ง„ ๋‹คํ•ญ ์‹œ๊ฐ„ [์•Œ๊ณ ๋ฆฌ์ฆ˜]์€ ์—†๊ณ , [FPTAS]๋งŒ ์กด์žฌํ•œ๋‹ค.

์ถœ์ฒ˜: wikipedia(https://ko.wikipedia.org/wiki/%EB%B0%B0%EB%82%AD_%EB%AC%B8%EC%A0%9C)

ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ๋ผ์ด์–ธ์€ ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. 
์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, 
๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค.
๋ผ์ด์–ธ์ด ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. 
๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ๋ผ์ด์–ธ์•„ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค. 
์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ๋ผ์ด์–ธ์€ ์ตœ๋Œ€ K๋งŒํผ์˜ ๋ฌด๊ฒŒ๋งŒ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค.
๋ผ์ด์–ธ์ด ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.


์ž…๋ ฅ
์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 โ‰ค N โ‰ค 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 โ‰ค K โ‰ค 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 
๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 โ‰ค W โ‰ค 100,000)์™€ 
ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 โ‰ค V โ‰ค 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋ฉฐ ์ œํ•œ์‹œ๊ฐ„์€ 2์ดˆ ์ด๋‹ค.

์ถœ๋ ฅ
ํ•œ ์ค„์— ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

4 7
6 13
4 8
3 6
5 12

์ถœ๋ ฅ
14
n, k = map(int, input().split())
knapsack = [[0 for _ in range(k + 1)] for _ in range(n + 1)] # ๋ฐฐ์—ด

item = [[0, 0]]
for i in range(1,n+1): # ์•„์ดํ…œ ์ž…๋ ฅ
    item.append(list(map(int, input().split())))

for i in range(1, n + 1): # ์•„์ดํ…œ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
    for j in range(1, k + 1):  # ์ตœ๋Œ€๋ฌด๊ฒŒ๊นŒ์ง€ ๋ฐ˜๋ณต

        weight = item[i][0]
        value = item[i][1]

        if j < weight:  # ๋ฌด๊ฒŒ๊ฐ€ ์•„์ดํ…œ ๋ฌด๊ฒŒ๋ณด๋‹ค ์ž‘์œผ๋ฉด
            knapsack[i][j] = knapsack[i - 1][j]  # ์œ„์˜ ๊ฐ’ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ
        else:
            knapsack[i][j] = max(value + knapsack[i-1][j - weight], knapsack[i - 1][j])
            # ํ˜„์žฌ ์•„์ดํ…œ๊ฐ€์น˜ + ๊ทธ์ „ ๋‹จ๊ณ„์—์„œ ๊ตฌํ•œ ๋‚จ์€๋ฌด๊ฒŒ์˜ ์ตœ๋Œ€๊ฐ€์น˜  (ํ˜„์žฌ ์•„์ดํ…œ + ์œ—์ค„(๋‚จ์€ kg๋งŒํผ)
            #  vs  ๊ทธ์ „๋‹จ๊ณ„์—์„œ ๊ตฌํ•œ ํ˜„์žฌ ์•„์ดํ…œ์˜ ์ตœ๋Œ€๊ฐ€์น˜ ( ์œ—์ค„ )

print(knapsack[n][k])

Heap


heap์€ ์™„๋ฒฝํ•œ ์ด์ง„ ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ์ด๋ฉฐ, nlogn์˜ ์†๋„๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

์ด ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ์ผ์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๋•Œ, index๋Š” ์™ผ์ชฝ ์ž์‹์€ ๋ถ€๋ชจ์˜ ์ธ๋ฑ์Šคx2, ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ๋ถ€๋ชจ์˜ ์ธ๋ฑ์Šคx2+1์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

max heap

Max Heap์˜ ๊ณผ์ •

๋ถ€๋ชจ๋Š” ํ•ญ์ƒ ์ž์‹๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ๊ฐ€ ์ž‘์œผ๋ฉด ์ž์‹๊ณผ swapํ•ด์ค˜์•ผํ•จ.

-์‚ฝ์ž…

insert๊ณผ์ •์—์„œ๋Š” ์ ค ์œ„๋งŒ ํฐ ์ˆ˜์ด๊ณ , ์•„๋ž˜๋Š” ์ •๋ ฌ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. ๋‹จ์ง€, ์ž์‹์ด ๋ถ€๋ชจ๋ณด๋‹ค ์ž‘๋‹ค๋Š” ๊ฒƒ์ผ๋ฟ.

-์ถœ๋ ฅ

๋”ฐ๋ผ์„œ ์ถœ๋ ฅ ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋ฅผ ์ •๋ ฌํ•˜์—ฌ heap์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

arr=[4,7,8,1,5,3,6,9]  # Maxheap
heap=[0]*20
hindex=1  # ํž™ ์ด๋ผ๋Š” 1์ฐจ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์—ญํ™œ

def insert(value):
    global heap,hindex
    heap[hindex]=value
    now=hindex
    hindex+=1

    while 1:
        parents=now//2 # ๋ถ€๋ชจ ์ธ๋ฑ์Šค ํ™•์ธ
        if parents==0: break  # ์ฒ˜์Œ์— ์ธ๋ฑ์Šค๊ฐ€ 1์ด๋ฉด ๊ทธ๋ƒฅ ๋„๊ธฐ
        if heap[parents]>heap[now]: break # ๋ถ€๋ชจ๊ฐ€ ๋” ํฌ๋ฉด ์Šค์™‘ ์•ˆํ•จ
        heap[parents],heap[now]=heap[now],heap[parents] # ๋ถ€๋ชจ๊ฐ€ ์ง€๊ธˆ ๋“ค์–ด์˜จ ์• ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์Šค์™‘
        now=parents  # ๋ถ€๋ชจ๋ฅผ ๊ทธ๋‹ค์Œ now๋กœ ๋†“๊ณ  ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ทธ๋‹ค์Œ ๋ถ€๋ชจ๋ž‘ ๋น„๊ต!!



def top():
    global heap
    return heap[1] # 1๋ฒˆ ์ธ๋ฑ์Šค์˜๊ฐ’ (๋ฃจํŠธ๋…ธ๋“œ ๋ฆฌํ„ด)

def pop():
    global heap,hindex
    heap[1]=heap[hindex-1] # ๋งจ ๋’ค์— ์žˆ๋Š” ์•„์ด๋ฅผ ๋ฃจํŠธ๋กœ ์ผ๋‹จ ์˜ฎ๊ธฐ๊ธฐ
    heap[hindex]=0
    hindex-=1

    now=1
    while 1:
        son=now*2 # ์™ผ์ชฝ์ž์‹
        rson=son+1 # ์˜ค๋ฅธ์ชฝ ์ž์‹

        # ์˜ค๋ฅธ์ชฝ์— ์ž์‹์ด ์žˆ๊ณ  ๊ทธ๋ฆฌ๊ณ  ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์ž์‹๋น„๊ตํ–ˆ๋Š”๋ฐ
        # ์˜ค๋ฅธ์ชฝ์ด ๋” ํฌ๋‹ค๋ฉด ์ž์‹์„ ์˜ค๋ฅธ์ชฝ์ฐœ ํ•˜๊ฒ ์Œ
        if heap[rson]!=0 and heap[son]<heap[rson]: son=rson
        if heap[now]>=heap[son]: break # ๋ถ€๋ชจ๊ฐ€ ๋‚ด๊ฐ€ ์ฐœํ•œ ์ž์‹๋ณด๋‹ค ํฌ๋ฉด ๋ธŒ๋ ˆ์ดํฌ
        heap[now],heap[son]=heap[son],heap[now] # ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ์Šค์™‘
        now=son # ํŠธ๋ฆฌ์˜ ๋ฐ‘์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ while ๋Œ๋ฉฐ ๊ทธ ๋ฐ‘์˜ ์ž์‹๊ณผ ๋น„๊ต

for i in range(len(arr)):
    insert(arr[i])   # ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ (1์ฐจ๋ฐฐ์—ด)

for i in range(len(arr)):
    print(top(),end=' ') # ๋ฃจํŠธ๋…ธ๋“œ ์ถœ๋ ฅ
    pop() # ๋งจ๋’ค์— ์žˆ๋Š”์•„์ด๋ฅผ 1๋ฒˆ ์ธ๋ฑ์Šค๋กœ ์˜ฌ๋ฆฌ๊ณ  ์ž์‹๋“ค์ด๋ž‘ ๋น„๊ต

min heap

max heap๊ณผ ๋ฐ˜๋Œ€๋กœ ์ ค ์ž‘์€ ๊ฐ’์ด ๋ฃจํŠธ์— ์˜ค๊ฒŒ ๋œ๋‹ค.

Min heap๊ณผ์ •

#Min heap
arr = [4,7,8,1,5,3,6,9]
INF=9889798698643  
heap = [INF]*20 #Min heap์ด๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค!
hindex=1

def insert(value):
    global heap, hindex
    heap[hindex]=value
    now=hindex
    hindex+=1

    while 1:
        parents=now//2 #๋ถ€๋ชจ ์ธ๋ฑ์Šค ํ™•์ธ
        if parents==0: break
        if heap[parents]<heap[now]:break
        heap[parents],heap[now] = heap[now],heap[parents] #๋ถ€๋ชจ๊ฐ€ ๋” ํฌ๋ฉด ์Šค์™‘ํ•˜๊ธฐ
        now = parents

def top():
    global heap
    return heap[1] #๋ฃจํŠธ ๋…ธ๋“œ ๋ฆฌํ„ด

def pop():
    global heap, hindex
    heap[1]=heap[hindex-1]
    heap[hindex]=INF #max heap์—์„œ๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ์ง€๋งŒ, min heap์€ INF๋กœ !!!!
    hindex-=1

    now=1
    while 1:
        son = now*2 #์™ผ์ชฝ์ž์‹
        rson = son+1 #์˜ค๋ฅธ์ชฝ ์ž์‹

        if heap[rson] !=0 and heap[son]>heap[rson]: #์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์ž‘๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ ์ฐœ
            son = rson
        if heap[now]<=heap[son]:break #๋ถ€๋ชจ๊ฐ€ ๋‚ด๊ฐ€ ์ฐœํ•œ ์ž์‹๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ฉˆ์ถ”๊ธฐ
        heap[now],heap[son]=heap[son],heap[now]
        now=son



for i in range(len(arr)):
    insert(arr[i])

for i in range(len(arr)):
    print(top(),end=' ') #root node ์ถœ๋ ฅํ•˜๊ธฐ
    pop() #heap sort

#๊ต์ˆ˜๋‹˜์ฝ”๋“œ
arr=[4,7,8,1,5,3,6,9]  #Minheap
heap=[0]*50
hindex=1  # ํž™ ์ด๋ผ๋Š” 1์ฐจ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์—ญํ™œ

def insert(value):
    global heap,hindex
    heap[hindex]=value
    now=hindex
    hindex+=1

    while 1:
        parents=now//2
        if parents==0: break
        if heap[parents]<=heap[now]: break
        heap[parents],heap[now]=heap[now],heap[parents]
        now=parents 



def top():
    global heap
    return heap[1] # 1๋ฒˆ ์ธ๋ฑ์Šค์˜๊ฐ’ (๋ฃจํŠธ๋…ธ๋“œ ๋ฆฌํ„ด)

def pop():
    global heap,hindex
    heap[1]=heap[hindex-1] # ๋งจ ๋’ค์— ์žˆ๋Š” ์•„์ด๋ฅผ ๋ฃจํŠธ๋กœ ์ผ๋‹จ ์˜ฎ๊ธฐ๊ธฐ
    heap[hindex]=0
    hindex-=1

    now=1
    while 1:
        son=now*2 # ์™ผ์ชฝ์ž์‹
        rson=son+1 # ์˜ค๋ฅธ์ชฝ ์ž์‹

        if rson<=hindex and heap[son]>heap[rson]: son=rson
        if son>hindex or heap[now]<heap[son]: break
        heap[now],heap[son]=heap[son],heap[now]
        now=son

for i in range(len(arr)):
    insert(arr[i])   # ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ (1์ฐจ๋ฐฐ์—ด)

for i in range(len(arr)):
    print(top(),end=' ') # ๋ฃจํŠธ๋…ธ๋“œ ์ถœ๋ ฅ
    pop() # ๋งจ๋’ค์— ์žˆ๋Š”์•„์ด๋ฅผ 1๋ฒˆ ์ธ๋ฑ์Šค๋กœ ์˜ฌ๋ฆฌ๊ณ  ์ž์‹๋“ค์ด๋ž‘ ๋น„๊ต

์ถ”๊ฐ€์ ์ธ TIL....

ํ›„..... ๊ต์ˆ˜๋‹˜์ด ๋ถ€๋“ฑํ˜ธ๋งŒ ์ž˜ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค๊ณ ํ•ด์„œ ๋ถ€๋“ฑํ˜ธ๋งŒ ๋ฐ”๊ฟจ๋Š”๋ฐ..... ์ธ๋ฑ์Šค ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค...

์ด์œ ๋Š” heap์„ ์ƒ์„ฑํ•  ๋•Œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์„œ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ.... ์ด๊ฒŒ ๋ฌธ์ œ์˜€๋‹ค!

์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋น„๊ตํ•  ๋•Œ ์ž‘์€๊ฑฐ๋กœ ์Šค์™‘ํ•˜๋Š”๋ฐ ๊ทธ ์˜ค๋ฅธ์ชฝ ๊ฐ’์ด 0์ด๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ๊ณ„์† .....๊ณ„์†.... now=son๋ถ€๋ถ„์ด ๊ณ„์† ๊ฐ€๋ฒ„๋ ธ๋‹ค....

๊ทธ๋ž˜์„œ INF = 879886451 ์ด๋Ÿฐ๊ฑธ ๋งŒ๋“ค์–ด ์ด๊ฑฐ๋กœ ์ฒ˜์Œ์— heap์„ ๋“ค๋•Œ ์ดˆ๊ธฐํ™” ํ–ˆ๊ณ , pop()์—์„œ hindex๋ถ€๋ถ„๋„ INF๋กœ ์ดˆ๊ธฐํ™”ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

์ด๊ฒƒ๋„ ๋‹ค๋ฅธ๋ถ„๊ป˜ ๋„์›€์„ ๋ฐ›์•„ ํ•ด๊ฒฐํ–ˆ๋‹ค....^,ใ…  ์•„์ง ๋””๋ฒ„๊น… ํ•ด๋„ ๋ฌธ์ œ๋ฅผ ๊ณ ์น˜๋Š” ๊ฒƒ์— ํ•œ๊ณ„๊ฐ€ ๋Š๊ปด์ง„๋‹ค...