๋‚ด ์ธ์ƒ์—์„œ ๋ฏฟ์„ ๊ฑด ์˜ค์ง ๋‚˜ ์ž์‹ ๋ฟ!

The only one you can truly trust is yourself.

๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Python ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํž™ํ, ๋””ํ๋กœ ๋ณ€๊ฒฝ

๐ŸŽฎinspirer9 2023. 2. 10. 21:24
728x90
๋ฐ˜์‘ํ˜•

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค "๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ" ๋ฌธ์ œ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ํ’€์—ˆ์—ˆ๋Š”๋ฐ, ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํŒŒ์ด์ฌ ๋‚ด์žฅ heapq๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ์ž„๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ํž™ํ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

https://inspirer9.tistory.com/400

 

ํŒŒ์ด์ฌ ์šฐ์„ ์ˆœ์œ„ํ, ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ, ๊ธธ์ฐพ๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต ๊นŠ์ด/๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(DFS/BFS) ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ ๋ณด๊ธฐ ๋‚ด๊ฐ€ ํ‘ผ ๋ฐฉ์‹์€... ํƒ์ƒ‰ํ•  ๋‹ค์Œ ์œ„์น˜๋“ค์€ ์šฐ์„ ์ˆœ์œ„ ํ์— ์ €์žฅํ–ˆ๊ณ , ์œ„์น˜

inspirer9.tistory.com

์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ํž™ํ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ 

  • ๋‘˜ ๋‹ค O(logN)์ด๊ณ  ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ๋Š” heapq๋ฅผ ์“ฐ๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.
  • heapq๊ฐ€ PriorityQueue๋ณด๋‹ค ์‹คํ–‰์‹œ๊ฐ„์ด ์ ๊ฒŒ ๊ฑธ๋ฆฐ๋‹ค.

์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ํž™ํ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ• 

  • ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ํž™ํ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์™ผ์ชฝ ํ•ญ๋ชฉ๋“ค์„ ์šฐ์ธก ํ•ญ๋ชฉ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.
PriorityQueue heapq
from queue import PriorityQueue

pq = PriorityQueue()

pq.put(1)
pq.put(3)
pq.put(2)

pq.get() # 1
pq.get() # 2
pq.get() # 3
import heapq

pq = []

heapq.heappush(pq, 1)
heapq.heappush(pq, 3)
heapq.heappush(pq, 2)

heapq.heappop(pq) # 1
heapq.heappop(pq) # 2
heapq.heappop(pq) # 3
 

์šฐ์„ ์ˆœ์œ„ํ ๊ฟ€ํŒ

  • PriorityQueue์™€ heapq๋Š” ์ตœ์†Œ ํž™๋งŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์ˆ˜๋ถ€ํ„ฐ pop ํ•˜๊ณ ์‹ถ์„ ๋•Œ๋Š” - ๋ถ€ํ˜ธ๋ฅผ ๋ถ™ํ˜€ push/popํ•œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ

์šฐ์„ ์ˆœ์œ„ ํ (PriorityQueue)

from queue import PriorityQueue

def solution(maps):
    #if maps[0][0] == 0: #์ด์ œ ๋ณด๋‹ˆ ์ด ๋ถ€๋ถ„ ํ•„์š”์—†๋„ค?
    #    return -1    

    pq = PriorityQueue() #๊ทธ๋ƒฅ ํ๋ฅผ ์จ๋„ ๋˜๋Š” ๋“ฏ... ใ…ก.ใ…ก;
    
    dist = 1
    sx, sy = 0, 0
    ex, ey = len(maps[0]), len(maps)
    INF = 10001 #float์„ ์“ธ ํ•„์š”๊ฐ€ ์—†์Œ.
        #float("inf") #ํŒŒ์ด์ฌ 3.5 ์ด์ƒ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    
    for y in range(ey):
        for x in range(ex):
            if maps[y][x] != 0:
                maps[y][x] = INF
    
    pq.put([dist,(sx,sy)])
    while pq.empty() == False:
        t = pq.get()
        dist = t[0]
        x = t[1][0]
        y = t[1][1]
        
        if y == ey-1 and x == ex-1:
            return dist

        if dist < maps[y][x]:
            maps[y][x] = dist
            dist += 1
            if sx < x and dist < maps[y][x-1]:
                pq.put([dist,(x-1,y)])
            if x < ex-1 and dist < maps[y][x+1]:
                pq.put([dist,(x+1,y)])
            if sy < y and dist < maps[y-1][x]:
                pq.put([dist,(x,y-1)])
            if y < ey-1 and dist < maps[y+1][x]:
                pq.put([dist,(x,y+1)])

    return -1

ํž™ ํ (heapq)

import heapq

def solution(maps):
    #if maps[0][0] == 0: #์ด์ œ ๋ณด๋‹ˆ ์ด ๋ถ€๋ถ„ ํ•„์š”์—†๋„ค?
    #    return -1    

    pq = []
    
    dist = 1
    sx, sy = 0, 0
    ex, ey = len(maps[0]), len(maps)
    INF = 10001 #float์„ ์“ธ ํ•„์š”๊ฐ€ ์—†์Œ.
        #float("inf") #ํŒŒ์ด์ฌ 3.5 ์ด์ƒ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    
    for y in range(ey):
        for x in range(ex):
            if maps[y][x] != 0:
                maps[y][x] = INF
    
    heapq.heappush(pq, [dist,(sx,sy)])
    while len(pq) > 0:
        t = heapq.heappop(pq)
        dist = t[0]
        x = t[1][0]
        y = t[1][1]
        
        if y == ey-1 and x == ex-1:
            return dist

        if dist < maps[y][x]:
            maps[y][x] = dist
            dist += 1
            if sx < x and dist < maps[y][x-1]:
                heapq.heappush(pq, [dist,(x-1,y)])
            if x < ex-1 and dist < maps[y][x+1]:
                heapq.heappush(pq, [dist,(x+1,y)])
            if sy < y and dist < maps[y-1][x]:
                heapq.heappush(pq, [dist,(x,y-1)])
            if y < ey-1 and dist < maps[y+1][x]:
                heapq.heappush(pq, [dist,(x,y+1)])

    return -1

๋”” ํ(deque)

  • ์†Œ๋ฌธ์—๋Š” ๋” ๋น ๋ฅด๋‹ค๋Š” ๋””ํ๊ฐ€ ์žˆ์–ด์„œ ๋””ํ๋กœ๋„ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค.
from collections import deque

def solution(maps):
    q = deque()
    dist = 1
    sx, sy = 0, 0
    ex, ey = len(maps[0]), len(maps)
    INF = 10001

    for y in range(ey):
        for x in range(ex):
            if maps[y][x] != 0:
                maps[y][x] = INF

    q.append((dist, (sx, sy)))
    while q:
        dist, (x, y) = q.popleft()
        
        if y == ey - 1 and x == ex - 1:
            return dist
        
        if dist < maps[y][x]:
            maps[y][x] = dist
            
            for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):
                nx, ny = x + dx, y + dy
                if nx >= 0 and nx < ex and ny >= 0 and ny < ey and dist + 1 < maps[ny][nx]:
                    q.append((dist + 1, (nx, ny)))
    
    return -1

์†๋„ ๋น„๊ต

  • ๋นจ๋ผ์กŒ๋‹ค. heapq๊ฐ€ ๋” ๋น ๋ฅด๋‹ค. ๊ทผ๋ฐ deque๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.
PriorityQueue heapq deque
์ •ํ™•์„ฑ  ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (0.10ms, 10.4MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.4MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (0.13ms, 10.5MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (0.09ms, 10.3MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ ํ†ต๊ณผ (0.20ms, 10.4MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰ ํ†ต๊ณผ (0.27ms, 10.4MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰ ํ†ต๊ณผ (0.23ms, 10.3MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰ ํ†ต๊ณผ (0.13ms, 10.3MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰ ํ†ต๊ณผ (0.20ms, 10.3MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰ ํ†ต๊ณผ (0.21ms, 10.4MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰ ํ†ต๊ณผ (0.10ms, 10.4MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰ ํ†ต๊ณผ (0.08ms, 10.3MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰ ํ†ต๊ณผ (0.12ms, 10.4MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰ ํ†ต๊ณผ (0.11ms, 10.3MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰ ํ†ต๊ณผ (0.11ms, 10.4MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.3MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰ ํ†ต๊ณผ (0.17ms, 10.3MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰ ํ†ต๊ณผ (0.08ms, 10.3MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.1MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.3MB)
ํ…Œ์ŠคํŠธ 21 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.3MB)

ํšจ์œจ์„ฑ  ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (84.16ms, 10.6MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (14.37ms, 10.5MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (39.36ms, 10.6MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (22.83ms, 10.4MB)
์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.3MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.4MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.2MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.2MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.3MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.2MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰ ํ†ต๊ณผ (0.11ms, 10.4MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.2MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰ ํ†ต๊ณผ (0.09ms, 10.2MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.3MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.3MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.3MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.4MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.2MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.3MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.2MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.3MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.3MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.4MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.3MB)
ํ…Œ์ŠคํŠธ 21 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.4MB)

ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (23.62ms, 10.1MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (4.68ms, 10.1MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (11.67ms, 10.2MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (6.93ms, 10.4MB)
์ •ํ™•์„ฑ  ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.1MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.3MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.3MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.2MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ ํ†ต๊ณผ (0.04ms, 10.3MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰ ํ†ต๊ณผ (0.07ms, 10.1MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰ ํ†ต๊ณผ (0.09ms, 10.1MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.2MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰ ํ†ต๊ณผ (0.09ms, 10MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.3MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.2MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.3MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.3MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.1MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.3MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.2MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰ ํ†ต๊ณผ (0.08ms, 10.1MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.2MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.2MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.2MB)
ํ…Œ์ŠคํŠธ 21 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.3MB)
ํšจ์œจ์„ฑ  ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (11.94ms, 10.2MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (3.38ms, 10.3MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (8.15ms, 10.4MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (5.36ms, 10.3MB)

Priority Queue, heapq, deque ๊ตฌํ˜„๋ฐฉ์‹์˜ ์ฐจ์ด์ 

  • ๋„๋Œ€์ฒด ๋ญ” ์ฐจ์ด๊ฐ€ ์žˆ์–ด์„œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๊ฑด๊ฐ€?
PriorityQueue heapq deque
ํด๋ž˜์Šค ๋ชจ๋“ˆ (๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ์ง€์›) ๋ชจ๋“ˆ(Collections)
์ตœ์†Œํž™
heap์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ
์†๋„๊ฐ€ ๋” ๋Š๋ฆผ
์ตœ์†Œํž™, ์ตœ๋Œ€ํž™(-์‚ฌ์šฉ)
๋‹ค์ต์ŠคํŠธ๋ผ, ์ตœ์†Œ๊ฐ’์ด๋‚˜ ์ตœ๋Œ€๊ฐ’์„ ๋นจ๋ฆฌ ์ฐพ์•„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ
์„ ์ž…์„ ์ถœ, ํ›„์ž…ํ›„์ถœ, ์„ ์ž…ํ›„์ถœ, ํ›„์ž…์„ ์ถœ ๋‹ค๋จ.
BFS์— ์‚ฌ์šฉ
  • ์ ์ ˆํ•˜์ง€ ์•Š์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์œผ๋กœ ๊ฒฐ๋ก  ใ…‹ใ…‹ใ…‹
728x90
๋ฐ˜์‘ํ˜•