๋„์ ๋„์  ์ฝ”๋”ฉ์ผ๊ธฐ

Deque ๊ฐœ๋… ์ •๋ฆฌ + BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

์š”๋Œœ๋‹ค 2022. 7. 30. 18:06

Deque๋Š” bfs ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ๊ฑฐ์˜ ํ•„์ˆ˜๋กœ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์šฐ์„ , Deque๋ž€?
์Šคํƒ์ด๋‚˜ ํ์ฒ˜๋Ÿผ ํ•œ ๋ฐฉํ–ฅ์—์„œ ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ , ์–‘๋ฐฉํ–ฅ์—์„œ ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

https://wiki.python.org/moin/TimeComplexity

 

TimeComplexity - Python Wiki

This page documents the time-complexity (aka "Big O" or "Big Oh") of various operations in current CPython. Other Python implementations (or older or still-under development versions of CPython) may have slightly different performance characteristics. Howe

wiki.python.org

๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ ์‚ฝ์ž…์ด ์ž์œ ๋กœ์šด๋ฐ, ๊ตณ์ด ์Šคํƒ,๋ฑ ์„ ์“ธ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?
์œ„ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด,
list์—์„œ ์‚ญ์ œ์—ฐ์‚ฐ์€ O(n), deque์—์„œ ์‚ญ์ œ๋Š” O(1)๋งŒํผ ๊ฑธ๋ฆฐ๋‹ค.
์ž‘์€ ์—ฐ์‚ฐ์ผ ๋• ๊ดœ์ฐฎ์ง€๋งŒ, ์—ฐ์‚ฐ๋Ÿ‰์ด ๋ณต์žกํ•˜๊ณ  ์ปค์งˆ์ˆ˜๋ก ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ๋งŒํผ ์ค‘์š”ํ•œ ๊ฒŒ ์—†์„ ๊ฒƒ์ด๋‹ค.

์™œ ? list์—์„œ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š”๋ฐ O(n)์ด๋‚˜ ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ?
list์—์„œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ, ๊ทธ ์š”์†Œ๋งŒ ๋น ์ง€๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ทธ ์š”์†Œ๋ฅผ ์ง€์šฐ๊ณ  ๋ชจ๋“  ์š”์†Œ๋ฅผ ์•ž์œผ๋กœ ๋‹น๊ฒจ์ค€๋‹ค. ๊ทธ๋ ‡๊ธฐ์— O(n)์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๊ณ , ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฑ(deque)๋ฅผ ์จ์•ผํ•˜๋Š” ์ด์œ ์ด๋‹ค.


Deque๋ฅผ ์ž˜ ์“ฐ๊ธฐ ์œ„ํ•ด Deque ์ž์ฃผ ์“ฐ์ด๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

- ์‚ฝ์ž… (append( ๊ฐ’ ), appendleft( ๊ฐ’ ))

from collections import deque

q = deque([1,2,3,4])
q.append('5')
q.appendleft('0')
print(q)

๊ฒฐ๊ณผ : ['0', 1,2,3,4, '5' ]

- ์‚ฝ์ž… ( insert( ์œ„์น˜, "์š”์†Œ" ) )

q = deque([1,2,3,4])
q.insert(2,"hello")
print(q)

2๋ฒˆ์งธ์— hello๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
๊ฒฐ๊ณผ : [1,2, "hello", 3, 4]

- ์‚ญ์ œ ( pop(), popleft() )

q = deque([1,2,3,4])
q.popleft() #[2,3,4] 1์‚ญ์ œ
q.pop()		#[2,3] 4์‚ญ์ œ
print(q)

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.
BFS๊ฐœ๋…์€ ์•„๋Š”๋ฐ ๋ง‰์ƒ ์ฝ”๋“œ๋ฅผ ์งœ๋ผ๊ณ  ํ•˜๋ฉด ์งœ์ง€ ๋ชปํ•œ๋‹ค..


0๋ฒˆ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด๋ณด์ž.
0์„ ํ์— ์‚ฝ์ž…ํ•˜์ž. ๋ฐฉ๋ฌธํ–ˆ์œผ๋‹ˆ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋„ ํ•ด์ฃผ์ž. (visited = Trie)
์ดํ›„ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ญ์ œํ•ด์ฃผ๋ฉด์„œ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, 0์„ ํ์—์„œ ์‚ญ์ œ(popleft)ํ•ด์ค€๋‹ค.
์‚ญ์ œํ•œ ์š”์†Œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.
0๊ณผ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋Š” 1,2,4์ด๋‹ค.
1,2,4 ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, (๋ฐฉ๋ฌธ๋…ธ๋“œ๊ฐ€ False)
q.appendํ•ด์ฃผ์ž! q์— ๋„ฃ์–ด์ฃผ๊ณ , ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•ด์ฃผ์ž!


๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
์ด์ œ ๋‹ค์‹œ ๋Œ์•„์™€์„œ 1์„ popleft()ํ•˜๋ฉด์„œ, 1์„ now๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.



1๊ณผ ์ธ์ ‘ํ•œ ๋…ธ๋“œ && ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ = ?
1๊ณผ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋Š” 0๊ณผ 2์ด์ง€๋งŒ, 0์€ ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด

1๊ณผ ์ธ์ ‘ํ•œ ๋…ธ๋“œ && ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ = 2์ด๋‹ค.
๋‹ค์‹œ 2๋ฅผ ๋ฐฉ๋ฌธํ•˜์ž



์œ„ ๊ณผ์ •์„ ํ•˜๋‹ค๋ณด๋ฉด,

๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•œ ๋…ธ๋“œ๋ฅผ popํ•ด์ฃผ๋ฉด์„œ ํ๊ฐ€ ๋น„๊ฒŒ ๋œ๋‹ค.
ํ๊ฐ€ ๋น„์›Œ์ง€๋ฉด, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค!

def bfs(graph, start, visited_bfs):
  q = deque( [start] )
  visited_bfs[start] = True
  while q:
    now = q.popleft()
    print(now,end=' ')
    for i in graph[now]:
      if visited_bfs[i] == False:
        q.append(i)
        visited_bfs[i] = True

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์‹œ์ž‘์ ์„ deque์— ๋„ฃ์–ด์ฃผ๊ณ , ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค.

์ดํ›„ ๋ฑ์ด ๋นŒ ๋•Œ๊นŒ์ง€ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋Œ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ + ๋ฑ์— ์ถ”๊ฐ€ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.